Xcode 9.0中的iOS 11.1功能

时间:2017-11-10 02:14:06

标签: ios swift xcode

(这是基于此处的问题: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

任何人都知道该怎么做?

1 个答案:

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