【发布时间】:2021-11-09 00:43:28
【问题描述】:
我有一个包含许多共享相同类型和访问器的属性的协议。我想将它们都声明在同一行,就像使用 Struct 一样,以节省多行垂直代码空间。
是否有任何 Swift 语法可以在单行或以某种压缩格式声明具有多个相同类型属性的协议?
struct SomeStruct {
var structA, structB: Int // ok
}
protocol SomeProtocol {
var protoA: Int { get } // ok
var protoB, protoC: Int { get } // error
var protoD, protoE: Int // error
// ok, but too verbose
var protoF: Int { get }; var protoG: Int { get }
}
尝试在同一行声明多个变量会导致两个错误:
带有多个变量的'var'声明不能有明确的getter/setter
隐含类型的变量不能有隐含的getter/setter
如果我省略了 getter/setter,则该属性对协议不再有效:
协议中的属性必须有明确的 { get } 或 { get set } 说明符
有没有办法将相同的{ get } 应用于多个协议属性?
【问题讨论】:
-
我要提醒一句。具有太多要求的协议是一种代码味道,因为它们很难遵守。这表明该协议可能做得太多,因此它们限制了conformers。例如,看看收集协议层次结构是如何分解的。如果我们只有一个收集协议完成了
RangeReplaceableCollection所做的所有事情,那么Dictionary将不可能符合要求,除非通过让它们调用fatalError()来人为地实现这些要求
标签: swift syntax swift-protocols