Swift中错误的数字转换

以下代码给了我答案“ 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 UIKitimport Cocoaimport Foundation),SWIFT将转换IntFloatDouble,和BoolNSNumber您可以通过打印看到这是正确的:

print(z.dynamicType)
__NSCFNumber

那是的内部表示NSNumber

NSNumber是包装原始类型的对象。在Objective-C中使用NSArray它将这些值存储在AnyObjects中。

有趣的约NSNumber是,你可以把所有这些类型的(IntDoubleFloatBool),然后取出来的值作为这些类型的任何。考虑:

let z: AnyObject = 3.14

print(z as! Int)     // 3
print(z as! Float)   // 3.14
print(z as! Bool)    // true

所以,当你查询的NSNumberis Intis Floatis Double,或者is Bool,它总是返回true意思是“我是类型,如果你想”。


使用Any代替AnyObject

如果使用Any,则将获得预期的结果:

let z: Any = 2

if z is Float {
    print("float")
} else {
    print("int")    // prints "int"
}

那是因为Any可以存储任何类型,而不仅仅是类的实例,所以基础类型仍然是Int

print(z.dynamicType)
Int

为什么将Swift分配给AnyObject时将Ints转换为NSNumber?

这样做是为了更轻松地使用基于Objective-C的框架(例如CocoaCocoa Touch)它使您可以将数组传递[2, 3.14, "hello"]给期望为的函数NSArray这肯定比容易使用NSArray(arrayLiteral: NSNumber(integer: 2), NSNumber(float: 3.14), NSString(string: "hello"))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章