Swift中如何化简标准库中冗长的类实例初始化代码

可能有些童鞋并不知道,在Swift中缩写点符号对于任何类型的任何static成员都有效.

我们实际写一个例子看一下:

import UIKit

class CFoo{
    static let sharedInstance = CFoo()
}

struct SFoo{
    static let sharedInstance = SFoo()
}

let foo:CFoo = .sharedInstance
let f:SFoo = .sharedInstance

以上代码中可以看到,foo类型为CFoo,而CFoo恰好拥有一个静态属性sharedInstance,所以可以使用缩写点符号来完成简化.f变量与foo类似.

咋一看好像只是一个小花招,没啥实际的用处,然而并不尽然,在Swift中要和传统的Objc代码打交道,经常可以看到C样式的枚举初始化代码:

animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)

是不是很讨厌呢!我们可以写一个扩展来简化语法(以下是代码摘录):

extension CAMediaTimingFunction
{
    // 这个属性会在第一次被访问时初始化。
    // (需要添加 @nonobjc 来防止编译器
    //  给 static(或者 final)属性生成动态存取器。)
    @nonobjc static let EaseInEaseOut = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)

    // 另外一个选择就是使用计算属性, 它同样很有效,
    // 但 *每次* 被访问时都会重新求值:
    static var EaseInEaseOut: CAMediaTimingFunction {
        // .init 是 self.init 的简写
        return .init(name: kCAMediaTimingFunctionEaseInEaseOut)
    }
}

接着我们可以这样优雅的使用啦:

animation.timingFunction = .EaseInEaseOut
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值