Swift中如何化简标准库中冗长的类实例初始化代码
发布时间:2020-12-14 06:49:23 所属栏目:百科 来源:网络整理
导读:可能有些童鞋并不知道,在Swift中缩写点符号对于任何类型的任何static成员都有效. 我们实际写一个例子看一下: import UIKit class CFoo{ static let sharedInstance = CFoo()} struct SFoo{ static let sharedInstance = SFoo()} let foo:CFoo = .sharedInsta
可能有些童鞋并不知道,在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
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |