大佬教程收集整理的这篇文章主要介绍了通用数组的Swift错误,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
protocol MyProtocol {} struct myType: MyProtocol {} class MyClass <T: MyProtocol> { func MyFunction(array: [T]) { if let myArray = array as? [myType] { println("Double!") } } } let instance = MyClass<myType>() let array = [myType(),myType()] instance.MyFunction(array)
然后它在if let行上说“myType不是’T’的子类型”.嗯,我认为,myType和T兼容.
if let first = array.first as? myType
但是现在我无法将数组转换为[myType](当然,我知道它是Swift的静态类型规范.)
我想知道问题是什么.我对泛型的理解?或者是Swift语言的限制?如果是这样,有没有办法这样做?
提前致谢.
class A { } class B: A { } let a: [A] = [B(),B()] // this is allowed - B is a subtype of A let b = a as? [B] let a: [AnyObject] = [1,2,3] // this is allowed - NSnumber is a subtype of AnyObject let b = a as? [NSnumber] struct S1 { } struct S2 { } let a = [S1(),S1()] // no Dice - S2 is not a subtype of S1 let b = a as? [S2]
该协议也无济于事:
protocol P { } struct S1: P { } struct S2: P { } let a = [S1(),S1()] // still no good – just because S1 and S2 both conform to P // doesn’t mean S2 is a subtype of S1 let b = a as? [S2]
您的示例基本上是最后一个的变体.你有一个[T]类型的数组,并且你想把它转换为[myType].重要的是要了解您没有[MyProtocol]类型的数组.您的泛型类型T是一种特定类型,它必须实现MyProtocol,但这不是一回事.
要了解为什么不能从任何类型转换为任何其他类型,请尝试以下代码:
protocol P { } struct S: P { } let a: [P] = [S(),S()] let b = a as? [S]
这将生成运行时错误:“致命错误:不能在不同大小的类型之间进行unsafeBitCast”.这给出了一个提示,说明为什么只能将包含一个引用类型的数组转换为子类型 – 这是因为发生的事情只是从一个指针类型转换为另一个指针类型.这适用于超类/子类,但不适用于任意类,结构或协议,因为它们具有不同的二进制表示.
以上是大佬教程为你收集整理的通用数组的Swift错误全部内容,希望文章能够帮你解决通用数组的Swift错误所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。