你有
typealias Stringish = String
var x: Stringish
func examp() {
x = "yo"
print(x)
}
你的代码库中有无数的
Stringish
。你突然意识到你需要更多类似的东西
struct StringBonus {
var value: String
var version: Int
}
typealias Stringish = StringBonus
这很好,但你必须将所有地方的“x”替换为“x.value”。
x.value = "yo"
print(x.value)
etc etc etc
var x: Stringish = tedious default value
etc etc etc
如果你还能正常引用 x 那就太不可思议了,
x = 69
还可以访问“隐藏”字段,
x.version = 2
任何人都可以想出一种方法来使结构“默认”到其中一个字段,或者实际上是一种达到相同结果的技巧方法。
我想令人惊叹的
@resultBuilder
会令人印象深刻,但我看不到一种方法来内联自由形式的resultBuilder(“x”所在的位置)。
也许有人有办法。
ExpressibleByStringLiteral
: 简化对象的初始化
struct Foo: ExpressibleByStringLiteral {
let value: String
let count: Int
init(value: String, count: Int = 0) {
self.value = value
self.count = count
}
init(stringLiteral value: StringLiteralType) {
self.init(value: value)
}
}
let foo: Foo = "hello"
print(foo) // Foo(value: "hello", count: 0)
ExpressibleByStringInterpolation
(但实现有点复杂,所以我不会在这里深入探讨)。
StringProtocol
的类型。这将实现您想要的(能够享受类似字符串的功能,但仍然拥有您自己的扩展属性)。但这有相当多的方法需要你实现,所以这是一个相当繁重的工作。此外,在我看来,这是本质上是“字符串类型”的东西(就像 Substring
一样),而不仅仅是您想要享受类似 String
的行为的一些随机模型类型。