Swift 5.5中的新功能: 编译器现在可以自动执行Double
和CGFloat
值之间的转换。
虽然这两者在 64 位系统上一直是等价的,但在 Swift 5.5 之前(目前作为 Xcode 13 的一部分处于测试阶段),我们必须在它们之间进行手动转换,以满足 Swift 的类型系统 - 因为就类型系统而言,它们是,而且仍然是两种不同的类型。
然而,当使用字面意义时,编译器总是能够根据当前的上下文来推断每个字面应该变成什么类型。例如,在下面的SwiftUI视图中,我们同时应用了scaleEffect
和opacity
修饰符,而不必指定前者接受CGFloat
,后者接受Double
。
struct DecorationImage: View {
var name: String
var body: some View {
Image(name)
.scaleEffect(0.5) // This is a CGFloat
.opacity(0.8) // This is a Double
}
}
但如果我们将这两个值定义为属性,那么我们就必须明确地将我们的scale
值输入为CGFloat
-- 否则它就会被解释为Double
,当我们试图将其传递给scaleEffect
修饰器时,就会出现编译器错误。
struct DecorationImage: View {
var name: String
var scale: CGFloat = 0.5
var opacity: Double = 0.8
var body: some View {
Image(name)
.scaleEffect(scale)
.opacity(opacity)
}
}
但在使用 Swift 5.5 时,这种情况就不存在了,我们现在可以自由地将Double
值传递给接受CGFloat
的函数,反之亦然。因此,我们可以选择将我们的两个属性CGFloat
,或者是双数,或者(我的个人偏好)完全删除类型信息,让编译器推断出它们是双数。
struct DecorationImage: View {
var name: String
var scale = 0.5
var opacity = 0.8
var body: some View {
Image(name)
.scaleEffect(scale)
.opacity(opacity)
}
}
好消息是,上述方法不仅适用于系统API,也适用于任何使用CGFloat
或Double
的代码或API。一个小的,但真的很好的新功能。