我在Xcode 8.3.3(Swift 3.1)的项目中有以下代码:
let font = CGFont(provider!)
CTFontManagerRegisterGraphicsFont(font, &error)
但在Xcode 9 Beta(Swift 4)中,我收到以下错误:
可选类型的价值' CGFont?'没有打开;你的意思是用吗? '!'或者'?'?
错误是因为CGDataProvider
let font = CGFont(provider)
CTFontManagerRegisterGraphicsFont(font!, &error)
现在返回一个可选项。
但是当我应用修复:
!
代码不再使用Swift 3.1在Xcode 8.3.3中编译,因为字体不是可选的,因此不能与(N)CHAR
很好地匹配。
有没有办法在两个版本的Xcode中使这个工作? Swift 4是否应该向后兼容(使用Swift 3编译器编译)?
答案 0 :(得分:7)
这是Core Graphics的一个重大变化,而不是Swift本身。 API已更改,初始化程序现在可以使用。
使用conditional compilation使用3.1和4.0编译器编译代码:
#if swift(>=4.0)
let font = CGFont(provider!)
#else
let font = CGFont(provider)!
#endif
CTFontManagerRegisterGraphicsFont(font, &error)
答案 1 :(得分:4)
我最终使用了以下方法,该方法允许向后兼容而无需条件编译(从this blog post获取的想法):
func optionalize<T>(_ x: T?) -> T? {
return x
}
这样在Xcode 8和Xcode 9中我都可以使用:
guard let font = optionalize(CGFont(provider)) else {
return
}
CTFontManagerRegisterGraphicsFont(font, &error)