[英]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
,或者是因為你進口UIKit
或Cocoa
每其中進口Foundation
。
導入Foundation
,將混合數組視為NSArray
,它與[AnyObject]
基本上相同。 這意味着放在該數組中的任何內容都必須是一個類的實例。 由於String
是結構,而Int
和Double
是基本類型,因此它們不是類。 將String
提升為NSString
,並將Int
和Double
封裝為NSNumber
。
如果您打印出值的dynamicTypes
,則可以看到以下內容:
print(mixedTypeArray[0].dynamicType) // _NSContiguousString
print(mixedTypeArray[1].dynamicType) // __NSCFNumber.Type
print(mixedTypeArray[2].dynamicType) // __NSCFNumber.Type
_NSContiguousString
是NSString
的內部表示。 __NSCFNumber.Type
是NSNumber
的內部表示。
但是數組本身僅持有一種類型: AnyObject
。
當您這樣做時:
let elementOfApparentlyUnknownType = mixedTypeArray[0] // AnyObject
那么該值的類型為AnyObject
因為這是數組要存儲的內容。 Swift並沒有看到該項目確實是NSString
因為這是運行時的考慮因素。 在編譯時,Swift沒有跟蹤您將String
放置在該數組的位置0
。 它只知道該數組具有NSString
類型(也稱為[AnyObject]
)。
變量的類型在Swift編譯時是已知的。 您可以隨時在Option上單擊任意變量以查看其類型。 因此,最好的Swift可以做的就是將變量AnyObject
為變量,因為在編譯時它不知道數組中值的基礎類型。
您可能已經聲明數組為[Any]
類型,然后值的dynamicTypes
將保持String
, Int
和Double
。 但是隨后,任何數組訪問都將產生類型為Any
的變量。
Swift不會推斷數組為[Any]
類型的數組。 如果您明確要求,它只會給您。 作為一般設計規則,如果發現自己使用Any
,則可能是錯誤地解決了該問題。
在Swift中,所有數組元素必須具有相同的類型。 在這種情況下,所有數組元素的類型都為Any(不是AnyObject,因為您提供了一個Int類型的值)。 第一個數組元素的類型為Any,而不是String。 第二個是Any類型,而不是Int類型。 等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.