Swift的.语法( .leading / .red等)

本文解析Swift中的ImplicitMemberExpression,探讨如何在VStack和枚举中通过编译器推断省略类型,并通过实例展示HorizontalAlignment和RepeatMode中的隐式成员使用技巧。
摘要由CSDN通过智能技术生成

在 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值