Swift 中是否有类似语法糖的方式来创建结构体的“默认成员”(就像将“隐藏字段”添加到类型中一样)?

问题描述 投票:0回答:1

你有

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”所在的位置)。

也许有人有办法。

swift5
1个回答
0
投票

这并不是您正在寻找的答案,但您可以使用

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
的行为的一些随机模型类型。

© www.soinside.com 2019 - 2024. All rights reserved.