2014-10-27 161 views
1

Swift提供了兩種特殊類型別名,用於處理非特定類型:
AnyObject可以表示任何類類型的實例。Swift問題:關於AnyObject類型鑄造

根據官方文件:參照以上和以下的情況下

class Person { 
    var name = "new name" 

    init(name: String) { 
     self.name = name 
    } 
} 

var people: [AnyObject] = [Person(name: "Allen"), Person(name: "Hank"), 23] 

爲什麼想什麼呢?我可以添加23(Int是一個結構體)到people數組中?

+2

你什麼錯誤得到?看起來像你有幾個無與倫比的parens和拼寫錯誤.. – Thilo 2014-10-27 05:25:53

回答

4

這有點令人困惑,因爲Swift對Objective-C的橋接,其中大部分東西都是類,而且值類型較少。要查看斯威夫特確實沒有的橋樑,打造一個新的平臺,並在頂部刪除import ...語句,然後嘗試投IntAny(沒問題)和AnyObject

let num = 23        // 23 
let anyNum: Any = num      // 23 
let anyObjectNum: AnyObject = num 
// error: type 'Int' does not conform to protocol 'AnyObject' 

現在在加import Foundation您的操場上方:

import Foundation 

let num = 23        // 23 
let anyNum: Any = num      // 23 
let anyObjectNum: AnyObject = num   // 23 

錯誤消失 - 爲什麼?當它看到將Int投射到AnyObject的嘗試時,Swift首先將num橋接爲Objective-C NSNumber類的一個實例,在Foundation中找到,然後將其轉換爲所需的AnyObject。陣列中發生同樣的事情。

您可以或多或少地證明了這是一個使用is關鍵字的情況下 - 因爲NSNumber橋樑所有數值類型的雨燕,它返回一些有趣的情況下true

anyNum is Int        // true 
anyNum is Double       // false 
anyObjectNum is Int      // true 
anyObjectNum is UInt      // true 
anyObjectNum is Double      // true 
anyObjectNum is Float      // true 
+0

+1爲解釋爲什麼加入基金會導致這種奇怪的行爲! – Jimmery 2014-11-10 11:33:11