В Swift UIControlState
не является переходом, но на самом деле структурой. Из справки языка для UIControl
:
Государственного контроля
состояния контроля; управление может иметь более одного состояния на времени. Государства признаются по-разному в зависимости от контроля. Для примера , экземпляр UIButton может быть сконфигурирован (с использованием метода setImage: forState:) для отображения одного изображения, когда оно находится в его нормальном состоянии , и другое изображение, когда оно подсвечено.
Декларация
struct UIControlState : OptionSetType {
init(rawValue rawValue: UInt)
static var Normal: UIControlState { get }
static var Highlighted: UIControlState { get }
static var Disabled: UIControlState { get }
static var Selected: UIControlState { get }
static var Focused: UIControlState { get }
static var Application: UIControlState { get }
static var Reserved: UIControlState { get }
}
Ключевым моментом здесь является OptionSetType
протокол (к которому UIControlState
Удовлетворяет), что позволяет нам делать «перечислимую типа» доступ к статическим структурам свойств, при условии, что они имеют RawValue
, который является BitwiseOperationsType
. Например .:
struct MyStruct : OptionSetType {
private var value: UInt
var rawValue: UInt { return self.value }
init(rawValue value: UInt) { self.value = value }
static var Normal: MyStruct { return self.init(rawValue: 1 << 0) }
static var Highlighted: MyStruct { return self.init(rawValue: 1 << 1) }
static var Disable: MyStruct { return self.init(rawValue: 1 << 2) }
// ...
}
let MyOptionsA : MyStruct = [MyStruct.Normal, MyStruct.Disable]
let MyOptionsB : MyStruct = [.Normal, .Disable]
MyOptionsB.contains(.Highlighted) // false
MyOptionsB.contains(.Normal) // true
Посмотрите на методы экземпляра (см ссылку на языке реф ниже), предоставленных в соответствии с OptionsSetType
. Кроме того, управление членством (например, .contains(...)
, как указано выше, также .remove(...)
, .insert(..)
), операции с опрятным набором, такие как union(...)
и intersect(...)
.
Итак, подведем итоги; вы правы, что подпись UIButton.setImage
запрашивает forState state: UIControlState
, но из-за протокола OptionSetType
массивный вид [UIControlState.Highlighted, UIControlState.Selected]
на самом деле является допустимым аргументом для вызова типа типа структуры UIControlState
.
Обратите внимание также на мой пример выше, что имя структуры может быть опущено, поэтому отправка [.Highlighted, .Selected]
в качестве аргумента forState
будет такой же хорошей.
Ссылка & хорошо читает: