大佬教程收集整理的这篇文章主要介绍了在Swift Generics中强制超类,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
为了清楚起见,我希望有一种方法可以做一些事情(知道语法不正确……):
@infix func + <T,U,X where X super T,X super U>(left : Array<T>,right : Array<U>) -> Array<X>{ //join both arrays }
func ??<T>(optional: T?,DefaultValue: @autoclosure () -> T) -> T func ??<T>(optional: T?,DefaultValue: @autoclosure () -> T?) -> T?
很明显,当使用这个运算符时,它会将T提升为传递给它的任何类型的最接近的共同祖先,一直到Any,例如:
let i: Int? = 3 let s: String? = "3" let a: Any? = i ?? s
这编译和工作,但是a的类型是Any(实际上是一个协议).在某些情况下,您需要向编译器提供类型证据,在某些情况下,您不需要.如果类型共享不是协议的共同祖先,则看起来不需要证据.你可能会这么想?正在由编译器进行特殊处理,但事实并非如此.你可以很容易地自己动手.
为了你的尝试,你正在过度思考它. (就像我遇到类似问题时那样.)你只需要一种类型.
func joinArrays<T>(array1: [T],array2: [T]) -> [T] { return array1 + array2 } class Base {} class Derived1 : Base {} class Derived2 : Base {} let a1 = [Derived1(),Derived1()] let a2 = [Derived2(),Derived2()] let a = joinArrays(a1,a2)
a的类型是Array< Base>,因为它是泛型类型参数的最近共同祖先.
我已经使用这种“类型促销”来创建各种复杂的合并/一元运算符,例如Haskell.唯一的问题是Swift不支持泛型类型参数的协方差.
以上是大佬教程为你收集整理的在Swift Generics中强制超类全部内容,希望文章能够帮你解决在Swift Generics中强制超类所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。