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