You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让使用previewCGImageRepresentation的代码同时兼容Xcode12与Xcode13

解决方案
  • 方案1:使用编译时条件判断(最稳妥)
    该方案利用Xcode版本和Swift编译器版本的绑定关系做编译时分流,无运行时开销,逻辑清晰稳定。Xcode 13系列对应Swift 5.5及以上版本编译器,Xcode 12.5.1对应Swift 5.4及更低版本编译器,两个分支只会在对应编译环境下生效,不会出现编译报错。
extension AVCapturePhoto {
    func stupidOSChangePreviewCGImageRepresentation() -> CGImage? {
        #if compiler(>=5.5)
        // Xcode 13+ 编译环境,返回CGImage?
        return self.previewCGImageRepresentation()
        #else
        // Xcode 12及更低编译环境,返回Unmanaged<CGImage>?
        return self.previewCGImageRepresentation()?.takeUnretainedValue()
        #endif
    }
}
  • 方案2:使用类型擦除适配(无编译条件)
    如果担心编译器版本和Xcode版本存在自定义适配的情况,可以将返回值先转为Any做运行时类型判断,两套编译环境都可以正常编译执行。
extension AVCapturePhoto {
    func stupidOSChangePreviewCGImageRepresentation() -> CGImage? {
        let result = self.previewCGImageRepresentation()
        // 适配两种返回类型
        if let cgImage = result as? CGImage {
            return cgImage
        } else if let unmanagedImg = result as? Unmanaged<CGImage> {
            return unmanagedImg.takeUnretainedValue()
        }
        return nil
    }
}

以上两种方案都可以完美覆盖需求,不需要使用不安全指针操作,也不需要自定义Xcode配置。

内容的提问来源于stack exchange,提问作者Rick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 15:21:01