首页 > 解决方案 > Swift 结构扩展协议

问题描述

我有一个简单的结构来分组一些字符串

struct MyStruct {
    static let bar = "BAR"
    static let foo = "FOO"
}

MyStruct.bar将返回字符串BAR

我想为结构中的每个项目添加更多属性。喜欢:

MyStruct.bar.desc应该返回一些关于MyStruct项目的自定义描述bar

我们可以像枚举一样扩展结构吗?就像是:

protocol MyProtocol {
    var desc:String { get }
}

extension MyProtocol where <No idea> { //where Self: RawRepresentable in Enum-case
    var desc: String {
        return "Custom description" //Based on the struct item
    }
}

所以,struct MyStruct:MyProtocol {..应该工作。

注意:我有 N 个结构,例如MyStruct. 所以,我不想在每个结构中单独实现自定义属性。

谢谢

标签: swiftstructprotocolsextension-methods

解决方案


如果你想写MyStruct().<item>.desc,我建议你看看CustomStringConvertible

符合 CustomStringConvertible 协议的类型可以提供自己的表示形式,以便在将实例转换为字符串时使用。

我不确定为什么 bar 是静态的,因为您似乎想要一个属性,所以我添加了一个baz类型的属性Baz

struct MyStruct: MyProtocol, CustomStringConvertible { // or you can make `MyProtocol` inherit from CustomStringConvertible
    struct Baz: CustomStringConvertible {
        let qux = "QUX"
        var description: String {
            qux
        }
    }
    static let bar = "BAR"
    static let foo = "FOO"
    let baz = Baz()
}

protocol MyProtocol {
    associatedtype Item: CustomStringConvertible
    associatedtype OtherItem: CustomStringConvertible
    static var bar: Item { get }
    var baz: OtherItem { get }
}


extension MyProtocol where Self: CustomStringConvertible {
    var description: String {
        return print(String(describing: baz)
    }
}

print(String(describing: MyStruct.bar)) // prints "BAR"
print(String(describing: MyStruct()) // prints "QUX"

推荐阅读