HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 具有通用枚举和通用协议的Swift类型擦除大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我不得不在 Swift中使用类型擦除几次,但它总是涉及通用协议.在这种情况下,它涉及通用枚举和通用协议,我很难过.

这是我的通用枚举和通用协议,具有必要的扩展:

enum UIState<T> {
    case Loading
    case success([T])
    case Failure(ErrorTypE)
}

protocol ModelsDelegate: class {
    associatedtype Model
    var state: UIState<[Model]> { get set }
}

extension ModelsDelegate {

    func getNewState(state: UIState<[Model]>) -> UIState<[Model]> {
        return state
    }

    func setNewState(models: UIState<[Model]>) {
        state = models
    }
}

这是我的类型擦除泛型类:

class AnymodelsDelegate<T>: ModelsDelegate {
    var state: UIState<[T]> {

        get { return _getNewState(UIState<[T]>) }  // Error #1
        set { _setNewState(newvalue) }
    }

    private let _getNewState: ((UIState<[T]>) -> UIState<[T]>)
    private let _setNewState: (UIState<[T]> -> Void)

    @L_673_2@ init<U: ModelsDelegate where U.Model == T>(_ models: U) {
        _getNewState = models.getNewState
        _setNewState = models.setNewState
    }
}

我收到以下错误(它们在代码示例中标记):

错误#1:

无法转换类型'(UIState< [T]>)的值.输入'(又名’UIState< Array< T>> .Type’)到预期的参数类型’UIState< [_]>‘ (又名’UIState< Array< _>>’)

我已经研究了一段时间了,这段代码有很多变化,“几乎可以工作”.错误总是与getter有关.

解决方法

导致此错误的问题(如 @dan has pointed out)是在此行上您尝试将类型作为参数传递,而不是该类型的实例:

get { return _getNewState(UIState<[T]>) }

但是,我首先会质疑你对这个函数使用一个参数,肯定一个get函数根本就没有参数?在这种情况下,您只需要_getNewState函数具有signature() – > UIState< [T]>,并将其称为:

get { return _getNewState() }

此外,如果您的协议扩展中的getNewState和setNewState(_ :)函数仅存在,以便将您的state属性获取和设置转发到类型擦除 – 您可以通过完全删除它们并使用闭包来简化代码而在类型擦除的init中的表达式:

_getNewState = { models.state }
_setNewState = { models.state = $0 }

(这些工作通过捕获模型参数的引用,有关详细信息,请参阅Closures: Capturing Values)

最后,我怀疑你的意思是指UIState< T>而不是UIState< [T]>在整个代码中,因为T在这种情况下引用了.success案例中的一个元素作为关联值(除非你想要一个2D数组).

总而言之,通过上面提出的更改,您将希望您的代码看起来像这样

enum UIState<T> {
    case Loading
    case success([T])
    case Failure(ErrorTypE)
}

protocol ModelsDelegate: class {
    associatedtype Model
    var state: UIState<Model> { get set }
}

class AnymodelsDelegate<T>: ModelsDelegate {
    var state: UIState<T> {
        get { return _getNewState() }
        set { _setNewState(newvalue) }
    }

    private let _getNewState: () -> UIState<T>
    private let _setNewState: (UIState<T>) -> Void

    @L_673_2@ init<U: ModelsDelegate where U.Model == T>(_ models: U) {
        _getNewState = { models.state }
        _setNewState = { models.state = $0 }
    }
}

大佬总结

以上是大佬教程为你收集整理的ios – 具有通用枚举和通用协议的Swift类型擦除全部内容,希望文章能够帮你解决ios – 具有通用枚举和通用协议的Swift类型擦除所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。