簡體   English   中英

Swift 結構按協議擴展

[英]Swift struct extension by protocol

我有一個簡單的結構來分組一些字符串

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的結構。 所以,我不想在每個結構中單獨實現自定義屬性。

謝謝

是的,您可以創建協議

protocol MyProtocol {}

使用desc的默認值

extension MyProtocol {
    var desc: String { "Custom description" /*Based on the struct item*/ }
}

並將其添加到您的結構中,例如

struct MyStruct: MyProtocol {}

有關更高級的版本,請參閱https://replit.com/@Dev1an/Swift-protocol-extension

如果您希望能夠編寫MyStruct().<item>.desc我建議您看一下CustomStringConvertible

符合 CustomStringConvertible 協議的類型可以提供自己的表示形式,以便在將實例轉換為字符串時使用。

我不確定為什么 bar 是 static 因為您似乎想要一個屬性,所以我添加了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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM