Swift 4向后兼容性

时间:2017-06-20 21:28:38

标签: ios swift swift4

我在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编译器编译)?

2 个答案:

答案 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)