以下代码给了我答案“ float”。
let z : AnyObject = Int(2)
if z is Float {
print("float")
} else {
print("int")
}
这是正确的吗?
我正在使用Xcode 7.3.1。
在纯Swift中,此行:
let z: AnyObject = Int(2)
给出错误:类型'Int'的值不符合指定的类型'AnyObject'
那是因为AnyObject持有对象(类的实例),但是不持有结构或原始类型。
当基金会是进口的(通过import UIKit
,import Cocoa
或import Foundation
),SWIFT将转换Int
,Float
,Double
,和Bool
成NSNumber
。您可以通过打印看到这是正确的:
print(z.dynamicType)
__NSCFNumber
那是的内部表示NSNumber
。
NSNumber
是包装原始类型的对象。在Objective-C中使用NSArray
它将这些值存储在AnyObject
s中。
有趣的约NSNumber
是,你可以把所有这些类型的(Int
,Double
,Float
,Bool
),然后取出来的值作为这些类型的任何。考虑:
let z: AnyObject = 3.14
print(z as! Int) // 3
print(z as! Float) // 3.14
print(z as! Bool) // true
所以,当你查询的NSNumber
与is Int
,is Float
,is Double
,或者is Bool
,它总是返回true
意思是“我是类型,如果你想”。
如果使用Any
,则将获得预期的结果:
let z: Any = 2
if z is Float {
print("float")
} else {
print("int") // prints "int"
}
那是因为Any
可以存储任何类型,而不仅仅是类的实例,所以基础类型仍然是Int
:
print(z.dynamicType)
Int
这样做是为了更轻松地使用基于Objective-C的框架(例如Cocoa和Cocoa Touch)。它使您可以将数组传递[2, 3.14, "hello"]
给期望为的函数NSArray
。这肯定比容易使用NSArray(arrayLiteral: NSNumber(integer: 2), NSNumber(float: 3.14), NSString(string: "hello"))
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句