Swift 5.0 開始支持Swift Property Wrapper, 不過之前沒有深入探究使用方法。今天我突然來了靈感,想到了其中的一個應(yīng)用場景。比如給屬性提供一個默認(rèn)參數(shù)。
定義Default類型
定義一個Default的類型,有一個類型T, 可以決定wrappedValue是什么類型。這里有一個默認(rèn)屬性defaultValue, 以及一個屬性value用來存儲屬性的值。當(dāng)調(diào)用屬性的時候,會判斷value是否為nil, 如果非nil返回value,否則返回defaultValue。當(dāng)然value也可以被設(shè)置。
@propertyWrapper
public struct Default<T> {
private var defaultValue: T
var value: T?
public init(_ defaultValue: T) {
self.defaultValue = defaultValue
}
public var wrappedValue: T? {
get { return value ?? defaultValue }
set { value = newValue }
}
}
例子
定義一個結(jié)構(gòu)體Item, 里面有3個屬性,都使用了Default的property wrapper. 比如intValue的類型是Int?, 那么Default的wrappedValue類型也為Int, 最終決定了value和defaultValue的參數(shù)類型。運(yùn)行代碼,最終得到以下結(jié)果。
struct Item {
@Default(2) var intValue: Int?
@Default(3) var doubleValue: Double?
@Default("Hello") var stringValue: String?
}
var item = Item()
print(item.intValue!) // 2
print(item.doubleValue!) // 3
print(item.stringValue!) // Hello
item.intValue = 4
item.doubleValue = 5
item.stringValue = "World"
print(item.intValue!) // 4
print(item.doubleValue!) // 5
print(item.stringValue!) // World