swift - 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
. 所以,我不想在每个结构中单独实现自定义属性。
谢谢
解决方案
如果你想写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"
推荐阅读
- vue.js - Vue v-bind:样式不随嵌套数据更改而更新
- scala - 在 hadoop 集群上提交 spark JAR 时出现 ClassNotFoundException 问题
- python - AWS DynamoDB - 提供的关键元素与架构不匹配
- nginx - 使用 NGINX 等 TLS 代理的 MinIO KES 的 HA 问题
- ibm-cloud - IBM Watson Studio 或 Watson Machine Learning 中的 WML_INSTANCE_NAME 是什么
- python - 如何指定要从 Yahoo Finance API 返回而不是获取所有字段?
- scala - 将 spark 数据框中的值限制为仅指定的值
- python - 如何添加到 websocket on_message 中的 manager.dict()
- firebase - GCP MFA 是否允许受信任的设备?
- python - 平均使用 *args 和类的属性