Swift中的错误号码铸造
下面的代码给出了答案Swift中的错误号码铸造,swift,xcode,Swift,Xcode,下面的代码给出了答案 let z : AnyObject = Int(2) if z is Float { print("float") } else { print("int") } 对吗 我正在使用Xcode 7.3.1。通过强制转换到任何内部转换为NSCFNumber的对象,因此所有这些验证都将通过: import Foundation let z:AnyObject = Int(2) print(z.dynamicType) // "__NSCFNumber\n
let z : AnyObject = Int(2)
if z is Float {
print("float")
} else {
print("int")
}
对吗
我正在使用Xcode 7.3.1。通过强制转换到任何内部转换为NSCFNumber的对象,因此所有这些验证都将通过:
import Foundation
let z:AnyObject = Int(2)
print(z.dynamicType) // "__NSCFNumber\n"
let isInt = z is Int // true
let isFloat = z is Float // true
let isDouble = z is Double // true
通过强制转换到任何对象,它在内部转换为NSCFNumber,因此所有这些验证都将通过:
import Foundation
let z:AnyObject = Int(2)
print(z.dynamicType) // "__NSCFNumber\n"
let isInt = z is Int // true
let isFloat = z is Float // true
let isDouble = z is Double // true
在纯Swift中,这一行:
let z: AnyObject = Int(2)
给出错误:“Int”类型的值不符合指定的类型“AnyObject”
这是因为AnyObject包含类的对象实例,但不包含结构或基本类型
通过导入UIKIT、导入COCOA或导入基础时,SWIFT会将int、浮点、双和BoL转换为NStNo。您可以通过打印看到这一点:
print(z.dynamicType)
print(z.dynamicType)
这是NSNumber的内部表示形式
NSNumber是一个包装基元类型的对象。它在Objective-C中用于将这些值存储在包含任何对象的NSArray中
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
所以,当您使用is Int、is Float、is Double或is Bool查询NSNumber时,它将始终返回真正的含义,如果您愿意,我可以是那种类型
使用Any而不是AnyObject
如果改为使用Any,则会得到预期的结果:
let z: Any = 2
if z is Float {
print("float")
} else {
print("int") // prints "int"
}
这是因为Any可以存储任何类型,而不仅仅是类的实例,因此底层类型仍然是Int:
为什么Swift在分配给任何对象时将INT转换为NSNumber?
这样做是为了更容易使用基于Objective-C的框架,如Cocoa和Cocoa Touch。它使您能够将[2,3.14,hello]之类的数组传递到需要NSArray的函数中。这当然比NSArrayarrayLiteral:NSNumberinteger:2、NSNumberfloat:3.14、NSStringstring:hello更容易使用。在纯Swift中,这行代码:
let z: AnyObject = Int(2)
给出错误:“Int”类型的值不符合指定的类型“AnyObject”
这是因为AnyObject包含类的对象实例,但不包含结构或基本类型
通过导入UIKIT、导入COCOA或导入基础时,SWIFT会将int、浮点、双和BoL转换为NStNo。您可以通过打印看到这一点:
print(z.dynamicType)
print(z.dynamicType)
这是NSNumber的内部表示形式
NSNumber是一个包装基元类型的对象。它在Objective-C中用于将这些值存储在包含任何对象的NSArray中
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
所以,当您使用is Int、is Float、is Double或is Bool查询NSNumber时,它将始终返回真正的含义,如果您愿意,我可以是那种类型
使用Any而不是AnyObject
如果改为使用Any,则会得到预期的结果:
let z: Any = 2
if z is Float {
print("float")
} else {
print("int") // prints "int"
}
这是因为Any可以存储任何类型,而不仅仅是类的实例,因此底层类型仍然是Int:
为什么Swift在分配给任何对象时将INT转换为NSNumber?
这样做是为了更容易使用基于Objective-C的框架,如Cocoa和Cocoa Touch。它使您能够将[2,3.14,hello]之类的数组传递到需要NSArray的函数中。这当然比NSArrayarrayLiteral:NSNumberinteger:2、NSNumberfloat:3.14、NSStringstring:hello更容易使用。您的代码将不会被执行。第一行将显示错误消息类型Int的值不确认为指定的类型AnyObject实际上它将执行,在PlayGround中检查它刚刚检查过,它不工作。我怀疑当它包装为AnyObject时,它可能存储为NSNumber,使用INT/Buff/Fuffes收益率为true。@ Brduca不适用于您,因为您可能没有顶部的导入基础。您的代码将不被执行。第一行将显示错误消息类型Int的值不确认为指定的类型AnyObject实际上它将执行,在PlayGround中检查它刚刚检查过,它不工作。我怀疑当它包装为AnyObject时,它可能存储为NSNumber,使用INT/Buff/Fuffes收益率为true。@ Brduca不适用于您,因为您可能没有顶部的导入基础。