Swift數組只能容納一種類型。當你宣稱:
let arr = [1, "a", 2.88]
斯威夫特取得[NSObject]
型arr
。您可以通過驗證此選項 - 點擊arr
查看其類型。這僅適用於您導入基金會(您的import UIKit
也導入Foundation
)。嘗試刪除import UIKit
。
然後,將值1
和2.88
轉化爲NSNumber
和"a"
到NSString
以便它們可以被存儲在數組[NSObject]
因爲Int
S,String
s和Double
s爲不NSObjects
。 NSNumber
和NSString
是NSObject
的子類。 Swift爲數組選擇了限制最多的類型。如果你的陣列是[1, true, 2.88]
,陣列類型應該是[NSNumber]
。
關於NSNumber
有趣的事情是它是一個包裝許多不同類型的對象容器。您可以將Int
放入並取出Double
。所以,當你使用is
進行測試時,它會產生誤導。它迴應「真實」的含義,「如果你願意,我可以做到」。
import Foundation
let n: NSNumber = 3.14
print(n is Int) // "true"
print(n is Double) // "true"
print(n is Bool) // "true"
print(n as! Int) // "3"
print(n as! Double) // "3.14"
print(n as! Bool) // "true"
注意:假如你宣佈你的arr
是[Any]
,那麼這會工作如你預期:
let arr:[Any] = [1, "a", 2.88]
let last = arr.last
if last is Int {
print("The last is Int.")
} else {
print("The last is not Int.") // "The last is not Int."
}
但斯威夫特不會創建數組輸入Any
給你,除非你明確要求(因爲坦率地說它是強類型語言的可憎)。如果您發現自己使用[Any]
,您應該重新考慮您的設計。
的唯一原因,雨燕創造[NSObject]
時基金會是進口的是調用可可和可可觸摸 API時,使我們的生活更輕鬆。如果此類API需要傳遞NSArray
,則可以發送[1, "a", 2.88]
而不是[NSNumber(integer: 1), NSString(string: "a"), NSNumber(double: 2.88)]
。
>然後,將這些值轉換爲「NSNumber」。但是,當我檢查'最後一個'變量的類型是'NSObject?',而不是'NSNumber'。 – pacification
'last'返回數組保存的可選變量。該數組是'[NSObject]'。這個特定的實例包含兩個'NSNumber'和一個'NSString',它們是'NSObject'的子類。 – vacawama
似乎編譯器從來沒有推斷過類型是'Any'或'[Any]',因此推斷這個數組類型的唯一可能的方法是(如果引用了Foundation)正在使用'NSNumber'轉換,然後使用'[AnyObject]'或'[NSObject]'。如果沒有'Foundation',編譯器會觸發一個錯誤。你仍然可以明確地使用'[Any]'。 – Sulthan