4

我不是在寻找如何正确地做到这一点的答案,而是为什么会发生这种情况。

这是代码:

func isInt(param: AnyObject?) {
    if let value = param as? Int {
        print(value)
    } else {
        print("Not Int")
    }

    if let value = param {
        if value is Int {
            print(value)
        } else {
            print("Not Int")
        }
    }
}

let a:AnyObject? = 1.2
let b:Float? = 1.2
let c:Double? = 1.2

isInt(a)
isInt(b)
isInt(c)

我明白在第一个if循环中,将param被转换为Int然后打印出来1

但是为什么在第二个if循环中,if value is Int是真的然后打印出来1.2

4

3 回答 3

4

看看https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html,具体来说:

Swift 数值结构类型的实例,如 Int、UInt、Float、Double 和 Bool,不能用 AnyObject 类型表示,因为 AnyObject 只表示类类型的实例。然而,当桥接到 Foundation 启用时,Swift 数值可以作为 NSNumber 类的桥接实例分配给 AnyObject 类型的常量和变量。

我们可以在 Playground 中看到这一点:

let value = 1.2
value.dynamicType                   //Double.Type
value is Int                        //false
let castValue = value as AnyObject
castValue.dynamicType               //__NSCFNumber.Type (a private framework class, part of the NSNumber class cluster)
//NSNumber is bridged to Int, UInt, Float, Double, and Bool so `is` tests for those types will return `true`
castValue is Int                    //true
castValue is Float                  //true
//NSNumber is not bridged to String so an `is` test will return `false`
castValue is String                 //false
于 2016-01-27T21:09:42.267 回答
3

在您的b情况下,let value = param连接value到一种NSNumber类型。因为NSNumber,value is Int将永远为真。

对于未桥接的值:

a is Int // always true, AnyObject bridges to NSNumber here
b is Int // false, cast from Float to Int always fails
c is Int // false, cast from Double to Int always fails

此答案假定 Foundation 已导入。没有Foundation,你的作业就会失败。

于 2016-01-27T21:05:33.840 回答
1

好吧,似乎如果您执行以下操作:

func isInt(param: AnyObject?) {

    if let value = param {
        if value is Double {
            print("I'm a double")
        }
    if value is Int{
            print("I'm an int")
        }else {
            print("Not Int")
        }
    }
}

它将为所有三个打印“I'm a double”,并为所有三个打印“I'm an int”。似乎当它进入 if 语句时,它会将值桥接到 NSNumber,这对于任何 NSNumber 类型都是正确的。

但是,假设您执行以下操作:

if let value = param {
        if value is String {
            print("I'm a String")
        } 
        if value is Int{
            print("I'm an int")
        }else {
            print("Not Int")
        }
    }
}

由于 String 不是 NSNumber 类型,它会跳过并转到 if value is Int,它是 NSNumber 类型并返回值。

于 2016-01-27T21:05:31.623 回答