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不适用于您,因为您可能没有顶部的导入基础。