请考虑以下代码:
func f(dict: [String: AnyObject]) {
let x = dict["mykey"]?.integerValue
// Do something with x
}
没有迹象表明dict["mike"]
可能是什么类型,但我可以在其上调用integerValue
。这段代码如何不会导致错误,或者至少是警告?
答案 0 :(得分:2)
这不会导致错误或警告,因为id
允许在其上调用任何NSObject方法,相当于Objective-C中的integerValue
。因此,在这种情况下,编译器不知道它将在那里,如果对象不支持{{1}},那么根据操场中的测试,你将在它的末尾得到0。
答案 1 :(得分:0)
.integerValue
的回复是可选的Int
:let 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"
的实际查找,而是.integerValue
上AnyObject
的尝试调用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