繁体   English   中英

Swift编译器为什么无法找出混合类型数组中元素的类型?

[英]Why can't the Swift compiler figure out the type of an element in a mixed-type array?

这是我的代码:

let string: String = "hello"
let int: Int = 5
let double: Double = 3.14

let mixedTypeArray = [string, int, double]
let elementOfApparentlyUnknownType = mixedTypeArray[0] // AnyObject

我已经非常明确地说明了混合类型数组mixedTypeArray中每个元素的类型。 但是,在获取数组中的第一个元素时,编译器不会将元素推断为String 而是类型为AnyObject

mixedTypeArray是一个NSArray ,因为Swift的本机Array类型不允许存储混合类型的元素(除非将它们全部转换为AnyObject ,但这会丢失类型信息)。 但是,如果NSArray凉爽与存储不同类型的元素,这是为什么mixedTypeArray[0]的类型AnyObject NSArray是否将所有元素都在AnyObject转换为AnyObject 有什么办法可以在编译时获取mixedTypeArray[0]的真实类型吗? 我想避免单独将mixedTypeArray每个元素从AnyObject转换为其实际类型。

Swift数组仅包含一种类型。 在纯Swift代码中,您的示例甚至无法编译。 您会得到以下错误: 错误:如果没有更多上下文,则表达式的类型是不明确的

您的代码编译,因为你已经Foundation进口的,或者是因为你明确规定import Foundation ,或者是因为你进口UIKitCocoa每其中进口Foundation

导入Foundation ,将混合数组视为NSArray ,它与[AnyObject]基本上相同。 这意味着放在该数组中的任何内容都必须是一个的实例。 由于String是结构,而IntDouble是基本类型,因此它们不是类。 String提升为NSString ,并将IntDouble封装为NSNumber

如果您打印出值的dynamicTypes ,则可以看到以下内容:

print(mixedTypeArray[0].dynamicType)  // _NSContiguousString
print(mixedTypeArray[1].dynamicType)  // __NSCFNumber.Type
print(mixedTypeArray[2].dynamicType)  // __NSCFNumber.Type

_NSContiguousStringNSString的内部表示。 __NSCFNumber.TypeNSNumber的内部表示。

但是数组本身仅持有一种类型: AnyObject

当您这样做时:

let elementOfApparentlyUnknownType = mixedTypeArray[0] // AnyObject

那么该值的类型为AnyObject因为这是数组要存储的内容。 Swift并没有看到该项目确实是NSString因为这是运行时的考虑因素。 在编译时,Swift没有跟踪您将String放置在该数组的位置0 它只知道该数组具有NSString类型(也称为[AnyObject] )。

变量的类型在Swift编译时是已知的。 您可以随时在Option上单击任意变量以查看其类型。 因此,最好的Swift可以做的就是将变量AnyObject为变量,因为在编译时它不知道数组中值的基础类型。

您可能已经声明数组为[Any]类型,然后值的dynamicTypes将保持StringIntDouble 但是随后,任何数组访问都将产生类型为Any的变量。

Swift不会推断数组为[Any]类型的数组。 如果您明确要求,它只会给您。 作为一般设计规则,如果发现自己使用Any ,则可能是错误地解决了该问题。

在Swift中,所有数组元素必须具有相同的类型。 在这种情况下,所有数组元素的类型都为Any(不是AnyObject,因为您提供了一个Int类型的值)。 第一个数组元素的类型为Any,而不是String。 第二个是Any类型,而不是Int类型。 等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM