(这是基于此处的问题:https://github.com/dokun1/Lumina/issues/44)
考虑以下功能:
fileprivate var discoverySession: AVCaptureDevice.DiscoverySession? {
var deviceTypes = [AVCaptureDevice.DeviceType]()
deviceTypes.append(.builtInWideAngleCamera)
if #available(iOS 10.2, *) {
deviceTypes.append(.builtInDualCamera)
}
if #available(iOS 11.1, *), self.captureDepthData == true {
deviceTypes.append(.builtInTrueDepthCamera)
}
return AVCaptureDevice.DiscoverySession(deviceTypes: deviceTypes, mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified)
}
我正在运行Xcode 9.0。我想运行一个在iOS 11.1中使用此功能的框架,该功能仅在Xcode 9.1中可用。此函数中出现错误的代码是:
if #available(iOS 11.1, *), self.captureDepthData == true {
deviceTypes.append(.builtInTrueDepthCamera)
}
当在别人的机器上运行Xcode 9.1时,这很好用,使用这个框架开发的应用程序可以设置10.0的开发目标,并且它编译得很好。但是,我甚至无法在我的机器上构建框架。我得到的错误是Type 'AVCaptureDevice.DeviceType' has no member 'builtInTrueDepthCamera' in Xcode 9.0
我认为使用#available
宏会解决这个问题,但它效果不好。
我也试过用这个:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 111000
if #available(iOS 11.1, *), self.captureDepthData == true {
deviceTypes.append(.builtInTrueDepthCamera)
}
#endif
但是这会导致错误读取:Expected '&&' or '||' expression
任何人都知道该怎么做?
答案 0 :(得分:4)
#available
将提升“SDK级别”,以便编译器允许您在部署目标之上使用API调用,但这不会阻止编译器编译#available
内的行范围。
您需要阻止编译器编译这些行,因为编译器没有.builtInTrueDepthCamera的定义。您可以使用#if构建配置语句来执行此操作。
在这种情况下,您要检查swift版本4.0.2。随Swift 4.0.2一起提供的Xcode 9.1。
#if swift(>=4.0.2)
if #available(iOS 11.1, *), self.captureDepthData == true {
deviceTypes.append(.builtInTrueDepthCamera)
}
#endif
来源:https://www.bignerdranch.com/blog/hi-im-available/#what-it-is-not