这是我的通用枚举和通用协议,具有必要的扩展:
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) required 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 =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 required init<U: ModelsDelegate where U.Model == T>(_ models: U) { _getNewState = { models.state } _setNewState = { models.state = } }}}
(这些工作通过捕获模型参数的引用,有关详细信息,请参阅Closures: Capturing Values)
最后,我怀疑你的意思是指UIState< T>而不是UIState< [T]>在整个代码中,因为T在这种情况下引用了.Success案例中的一个元素作为关联值(除非你想要一个2D数组).
总而言之,通过上面提出的更改,您将希望您的代码看起来像这样:
总结以上是内存溢出为你收集整理的ios – 具有通用枚举和通用协议的Swift类型擦除全部内容,希望文章能够帮你解决ios – 具有通用枚举和通用协议的Swift类型擦除所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)