为什么这个类型有问题的Swift代码不会产生错误?

时间:2016-01-14 23:17:03

标签: swift

请考虑以下代码:

func f(dict: [String: AnyObject]) {
    let x = dict["mykey"]?.integerValue
    // Do something with x
}

没有迹象表明dict["mike"]可能是什么类型,但我可以在其上调用integerValue。这段代码如何不会导致错误,或者至少是警告?

3 个答案:

答案 0 :(得分:2)

这不会导致错误或警告,因为id允许在其上调用任何NSObject方法,相当于Objective-C中的integerValue。因此,在这种情况下,编译器不知道它将在那里,如果对象不支持{{1}},那么根据操场中的测试,你将在它的末尾得到0。

答案 1 :(得分:0)

.integerValue的回复是可选的Intlet x: Int?。属性integerValue将使用键"myKey"的值初始化整数;但是,如果失败,将返回nil

如果词典中某个键的AnyObject 没有成功的方法来初始化给定值的整数(即integerValue计算属性),那么之后的最后一步上面问题x上的可选链接将返回nil,例如:

class MyClass {
    var myInt : Int
    init() {
        myInt = 1
    }
}

var myDict : [String:AnyObject] = ["myKey":MyClass()]
let a = myDict["myKey"]               // MyClass, OK
let x = myDict["myKey"]!.integerValue // nil

因此,请注意,它不是上面返回nil的键"myKey"的实际查找,而是.integerValueAnyObject的尝试调用MyClass() 1}} Int对象的实例,它自然地不存在(对于编译器)任何知道构造Update Issue Custom Field的方法。

答案 2 :(得分:0)

var part = message.BodyParts.OfType<TextPart> ().FirstOrDefault (); part.Text = part.Text.Replace ("x", "y"); 可选展开是一个红鲱鱼。写这样的例子会更好:

?

甚至更好,像这样:

func f(dict: [String: AnyObject]) {
    let x = dict["mykey"]!.integerValue
}

只要将某些内容输入为AnyObject,就可以向其发送任何已知的类消息。 Swift将安全地处理结果。因此,例如:

let ao : AnyObject = "howdy"
ao.integerValue