大佬教程收集整理的这篇文章主要介绍了将Swift泛型类转换为具有typealias的协议,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
protocol Protocol { typealias Thing } class Class<X>: Protocol { typealias Thing = X } func test<X:Protocol where X.Thing == Int> () -> X { return Class<Int>() // error: cannot convert return expression of type 'Class<Int>' to return type 'X' }
即使泛型类型和aliastype匹配,我似乎无法将对象强制转换为其协议.
编辑:
我通过从现有代码中提取逻辑来提出上述代码,以简化问题.这样做我犯了一些错误.这是一个更新的(并且希望不那么令人困惑)代码示例:
protocol Protocol { typealias Thing } class Class<X>: Protocol { typealias Thing = X } func test<Y: Protocol where Y.Thing == Int> () -> Y { return Class<Y.Thing>() }
我希望编译器允许test()编译,结果类型为Protocol< Int>.
let x: <WHAT-GOES-HERE?> = test()
x会是什么类型的?没有什么可以写在那里编译. x.Type会返回什么?你想要的是Protocol,其中Protocol.Thing == Int,但这不是Swift中的一个类型.这是一种类型约束.这是今天可以使用PAT的唯一方法.这就是为什么你不能拥有CollectionType< Int>类型的属性,以及为什么你不能编写test()函数.
该解决方案是一种类型橡皮擦,可将您的协议转换为具体的结构.例如:
protocol Protocol { typealias Thing func dosomething() -> Thing? } class Class<X>: Protocol { typealias Thing = X func dosomething() -> Thing? { return nil } } struct AnyProtocol<Thing> { var _dosomething: () -> Thing? func dosomething() -> Thing? { return _dosomething() } } func test() -> AnyProtocol<Int> { return AnyProtocol(_dosomething: Class<Int>().dosomething) }
Swift的某些未来版本可能会为您自动生成这些类型的橡皮擦,但我不知道任何具体的Swift-evolution建议,所以我们今天必须手工编写它们.
有关构建和使用类型擦除器的更多信息,请参阅A Little Respect for AnySequence.
以上是大佬教程为你收集整理的将Swift泛型类转换为具有typealias的协议全部内容,希望文章能够帮你解决将Swift泛型类转换为具有typealias的协议所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。