0

在 aUIControl中,如果我重写isHighlighted以设置私有_isHighlighted属性,然后检查控件state是否包含.highlighted,则状态仍然准确地反映了更改。请参阅下面的代码。

我的问题是,这怎么可能?我从不调用super.isHighlighted或操纵 state 财产。state是一个OptionSet必须将.highlighted属性插入到集合中的属性,据我所知,如果我覆盖该属性,则不会或不应该发生这种情况。

我能想到的唯一其他解释是,state它实际上是基于其他属性(即 , 等)的计算isSelected属性isEnabled

class MyControl: UIControl {

    private var _isHighlighted: Bool = false

    override var isHighlighted: Bool {
        get { return self._isHighlighted }
        set { self._isHighlighted = newValue }
    }

}


let myControl = MyControl()
myControl.isHighlighted = true
myControl.state.contains(.highlighted) // returns true
4

1 回答 1

2

我能想到的唯一其他解释是状态实际上是基于其他属性(即 isSelected、isEnabled 等)的计算属性。

很好的解释!让我们尝试在 getter 中记录(打印),看看是否正确:

class MyControl: UIControl {
    private var _isHighlighted: Bool = false
    override var isHighlighted: Bool {
        get { print("getting"); return self._isHighlighted }
        set { self._isHighlighted = newValue }
    }
}
let myControl = MyControl()
myControl.isHighlighted = true
print("about to check state")
myControl.state.contains(.highlighted)
print("checked state")

这是日志:

about to check state
getting
checked state

Quod erat 示范。

于 2018-08-13T18:27:47.510 回答