在 Swift 中,"."最常用的使用方式是“(class 或 struct的实例).(成员变量)”或“(class 或 struct).(静态成员变量)”,比如 apple.color,UIColor.red。
但是我们不时也会看到"."前面没有任何修饰,比如
VStack(.leading){
//some codes
}
UIColor(.red)
VStack(.leading){ //some codes } UIColor(.red)
这种语法叫做”Implicit Member Expression“,隐式的成员表示。作用是,当编译器能推断出 ”.“前面的类型时,可以省略前面的表达。
以 VStack(.leading)为例,我们先看 VStack 官方文档中的 init 函数:
.leading 对应的是 alignment 这一参数,类型是 HorizontalAlignment。我们再看 HorizontalAlignment 的定义:
可以看到,leading 其实是 HorizontalAlignment 的一个静态成员,它的类型也是 HorizontalAlignment。
所以在 VStack(alignment: )这个方法中,编译器能够推断出,传入的参数是HorizontalAlignment 类型,所以此时 .leading 就等于 .HorizontalAlignment.leading。
同理,在下面的代码中
let color : Color = Color.green
let color : Color = .green
let color : Color = Color.green let color : Color = .green
第一行和第二行是等效的,因为在声明color时我们显式地确定了它的类型是Color,所以在等号后面就可以直接用 .green 来替代 Color.green (green 是 Color 类中一个静态变量 )
Implicit Member Expression 的另一种常用场景是在枚举类(enum)中使用:
public enum RepeatMode {
case times(Int)
case forever
}
public extension RepeatMode {
static var never: RepeatMode {
return .times(0)
}
static var once: RepeatMode {
return .times(1)
}
}
public enum RepeatMode { case times(Int) case forever } public extension RepeatMode { static var never: RepeatMode { return .times(0) } static var once: RepeatMode { return .times(1) } }
在上面的代码段中,由于编译器可以推断出 never 是 RepeatMode 类型,所以在 return 语句中,.times(0) 就等价于 RepeatMode.times(0)