这是我在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()
函数。我的理解是,这不应该是可能的。
答案 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>