如何让使用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
相关产品推荐
相关产品推荐

