2015-12-29 4 views
1

Я следую Apple's Swift/iOS tutorial, и она имеет следующую строку кода:Массивы перечислений перечислены в Swift?

button.setImage(filledStarImage, forState: [UIControlState.Highlighted, UIControlState.Selected]) 

Но определение подписи UIButton.setImage «s является:

public func setImage(image: UIImage?, forState state: UIControlState) 

Там нет перегрузки setImage что принимает [UIControlState]() массив ,

Очевидно, что некоторые вуду продолжаются, может кто-нибудь объяснить?

ответ

5

В 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 будет такой же хорошей.


Ссылка & хорошо читает:

0

UIControlState соответствует протоколу OptionSetType, который предоставляет удобные методы для обработки BitwiseOperatio nsTypes. Так что это не setImage, который перегружен, но выглядит как массив. См. https://developer.apple.com/library/ios/documentation/Swift/Reference/Swift_OptionSetType_Protocol/index.html#//apple_ref/swift/intf/s:PSs13OptionSetType

Смежные вопросы