簡體   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