你能真的在AnyObject上调用任何Objective-C方法吗?

时间:2014-06-25 00:48:22

标签: swift

根据"使用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方法错误的声明?

1 个答案:

答案 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}}