大佬教程收集整理的这篇文章主要介绍了ios – 具有通用枚举和通用协议的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< _>>’)
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,请注明来意。