Swift如何在编译时解决这个问题?

时间:2015-10-23 14:42:05

标签: ios swift subclass

这是我在Swift编写的第二天,所以我很新。我在线获得了以下代码,使用Apple API在iOS设备上枚举音频/视频设备:

let devices = AVCaptureDevice.devices()

// Loop through all the capture devices on this phone
for device in devices {

    // Make sure this particular device supports video
    if (device.hasMediaType(AVMediaTypeVideo)) {
        ...
    }
}

现在,如果我查看AVCaptureDevice.devices()返回的内容,我会在Apple文档中找到它:

class func devices() -> [AnyObject]!

所以肯定这意味着设备属于AnyObject类型(一种非常通用的类型)和高度专业化的调用device.hasMediaType(...),我想这必须在一些更专业的子类中实现不应该是可能的。我希望错误AnyObject没有名为hasMediaType的函数(我很确定它不会)。

那么为什么这样呢?甚至自动完成似乎在编辑器中提供了hasMediaType()函数。我的理解是,这不应该是可能的。

2 个答案:

答案 0 :(得分:3)

/api/admin表示所有已知的Objective-C方法和属性都可用(请参阅here)。

您会注意到所有是作为自动填充提供的。这相当于在Objective-C中使用/api/report

如果使用AnyObject未实现的方法,您仍将获得自动完成功能,但在运行时会崩溃。

Apple正在逐步用可能的类型数组替换所有这些,因此最终会消除这种歧义。

答案 1 :(得分:1)

如果您查看AnyObject是什么,您会找到这样的文档

@objc protocol AnyObject
  

所有类隐式符合的协议。当用作   具体类型,所有已知的@objc方法和属性,   作为隐式解包的可选方法和属性,   在AnyObject的每个实例上。

例如

class A:NSObject{
    func a_test(){

    }
}

然后你打电话

  var b:AnyObject?;
  b?.a_test(); 
  

这在XCode中没问题,只是编译为向对象b发送消息,但在运行时会崩溃

因为,Objective C中的任何Object都是id,它是关于&#34;向对象发送消息&#34;它将由 Objective C runtime <解决/ p>