6

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

let font = CGFont(provider!)
CTFontManagerRegisterGraphicsFont(font, &error)

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

可选类型“CGFont?”的值 未拆封;你的意思是用'!' 或者 '?'?

该错误是因为CGFont 的初始值设定项现在CGDataProvider返回一个可选值。

但是当我应用以下修复时:

let font = CGFont(provider)
CTFontManagerRegisterGraphicsFont(font!, &error)

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

有没有办法在两个版本的 Xcode 中都可以做到这一点?Swift 4 是否应该向后兼容(使用 Swift 3 编译器编译)?

4

2 回答 2

7

这是核心图形的重大变化,而不是 Swift 本身。API 已更改,初始化程序现在可以失败。

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

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

CTFontManagerRegisterGraphicsFont(font, &error)
于 2017-06-20T21:39:35.127 回答
4

我最终使用了以下方法,该方法允许在没有条件编译的情况下实现向后兼容性(取自这篇博文的想法):

func optionalize<T>(_ x: T?) -> T? {
    return x
}

这种方式在 Xcode 8 和 Xcode 9 中我都可以使用:

guard let font = optionalize(CGFont(provider)) else {
    return
}
CTFontManagerRegisterGraphicsFont(font, &error)
于 2017-06-28T21:44:27.593 回答