根据"使用Swift with Cocoa和Objective-C"关于id
兼容性的iBook(在Loc 9附近):
您还可以调用任何Objective-C方法并访问任何属性,而无需转换为更具体的类类型。
书中给出的例子(如下所示)没有编译,这似乎与上述陈述相矛盾。根据该书,下面的最后一行不应该执行,因为length
对象上不存在NSDate
属性。
var myObject: AnyObject = UITableViewCell()
myObject = NSDate()
let myLength = myObject.length?
相反,这无法使用&#34编译;无法找到' length'接受提供的参数"最后一行出错。
这是一个错误,一个错字,还是关于调用任何Objective-C方法错误的声明?
答案 0 :(得分:1)
编译器错误说length
是一个函数,你用不正确的参数调用它
您可以myObject.length?()
返回nil
myObject.count?
也会给你nil
而不会出现编译错误
xcrun swift
Welcome to Swift! Type :help for assistance.
1> import Cocoa
2> var obj : AnyObject = NSDate()
obj: __NSDate = 2014-06-25 13:02:43 NZST
3> obj.length?()
$R5: Int? = nil
4> obj.count?
$R6: Int? = nil
5> obj = NSArray()
6> obj.length?()
$R8: Int? = nil
7> obj.count?
$R9: Int? = 0
8>
我认为编译器正在做的是搜索调用length
的所有方法和属性,它发现某些类提供length()
但没有类提供length
,因此出现错误消息。就像在ObjC中调用[obj nonexistmethod]
一样,即使您在nonexistmethod
类型对象上调用id
,编译器也会提示您 14> obj.notexist?
<REPL>:14:1: error: 'AnyObject' does not have a member named 'notexist'
obj.notexist?
^ ~~~~~~~~
14> obj.notexist?()
<REPL>:14:1: error: 'AnyObject' does not have a member named 'notexist()'
obj.notexist?()
^ ~~~~~~~~
不存在“
如果您尝试在Swift中调用不存在的方法
,则会发生这种情况{{1}}