【发布时间】:2017-12-26 23:41:19
【问题描述】:
我有这门课:
class ListView: UIView {
var labels: [UnderlineLabel]
var listItems: [String] { return [] }
var areUnselectable: Bool { return false }
...
}
到目前为止,我一直在使用这个类,方法是对它进行子类化并覆盖它的计算属性。但是现在我处于需要使用此类的情况,但我需要做的唯一更改是listItems 属性(它提供了字符串列表,转换为UnderlineLabels,并且可以选择(下划线))。因此,我认为与其子类 ListView 进行如此微不足道的更改以及单个用例,不如重构该类以支持组合使用。
我只能想出一种解决方案,它允许我保留计算属性语义(listItems 而不是 getListItems())并通过重写为子类提供可定制性,并通过初始化为实例化器提供可定制性:
创建一个额外的存储属性,可能是
private let getListItems: (() -> [String])?返回结果,如果
nil,则返回[],默认为listItems通过在
init中传递自定义值来初始化getListItems
这是获得我想要的功能的唯一方法吗?如果没有,是否有更明确的方法来做到这一点?
请记住,listItems 是计算属性的原因是为了让列表能够在执行期间更改。
【问题讨论】:
-
您能否在引用字符串属性等时发布整个类,但定义中未显示它们。
-
@UpholderOfTruth 抱歉,为了清楚起见,为了这个问题,将名称改为
listItems,并出于习惯使用strings编写问题。编辑它
标签: swift