Swift 4向后兼容性

Ada*_*hns 6 ios swift swift4

我在Xcode 8.3.3(Swift 3.1)的项目中有以下代码:

let font = CGFont(provider!)
CTFontManagerRegisterGraphicsFont(font, &error)
Run Code Online (Sandbox Code Playgroud)

但是在Xcode 9 Beta(Swift 4)中,我收到以下错误:

可选类型'CGFont?'的值 没有打开; 你的意思是用'!' 要么 '?'?

该错误是因为对CGFont初始化,需要一个CGDataProvider现在返回可选.

但是,当我应用修复:

let font = CGFont(provider)
CTFontManagerRegisterGraphicsFont(font!, &error)
Run Code Online (Sandbox Code Playgroud)

代码不再使用Swift 3.1在Xcode 8.3.3中编译,因为字体不是可选的,因此不能很好地与!.

有没有办法在两个版本的Xcode中使这个工作?Swift 4是否应该向后兼容(使用Swift 3编译器编译)?

And*_*nko 7

这是Core Graphics的一个重大变化,而不是Swift本身.API已更改,初始化程序现在可以使用.

使用条件编译使您的代码使用3.1和4.0编译器进行编译:

#if swift(>=4.0)
let font = CGFont(provider!)
#else
let font = CGFont(provider)!
#endif

CTFontManagerRegisterGraphicsFont(font, &error)
Run Code Online (Sandbox Code Playgroud)


Ada*_*hns 4

我最终使用了以下方法,该方法允许向后兼容而无需条件编译(想法取自这篇博客文章):

func optionalize<T>(_ x: T?) -> T? {
    return x
}
Run Code Online (Sandbox Code Playgroud)

这样在 Xcode 8 和 Xcode 9 中我都可以使用:

guard let font = optionalize(CGFont(provider)) else {
    return
}
CTFontManagerRegisterGraphicsFont(font, &error)
Run Code Online (Sandbox Code Playgroud)