[英]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.