Ответ 1
Swift 2.x позволяет это с помощью соответствия шаблону if: https://www.natashatherobot.com/swift-2-pattern-matching-with-if-case/
if case let .LoggedIn(name,password) = status {
print( "\(name) Logged in!" )
}
Я использую бета-версию 3 xcode 6, и у меня проблема с простейшей операцией if против перечисления, переданного в аргумент закрытия. Вот простое определение перечисления:
enum FLSTeslaLoginStatus {
case LoggedOut
case LoggedIn
case LoggingIn
case LoginFailed(NSData!, NSHTTPURLResponse!, NSError)
}
И код с ошибкой:
Как вы можете видеть, оператор switch работает нормально, но проверка if приводит к ошибке. Это всего лишь некоторый тестовый код, поэтому у меня обычно не будет оператора switch и if, но я пытаюсь выяснить, что случилось с оператором if. Я думаю, что это ошибка компилятора.
Это поддерживается в Swift 2.0 с использованием "if case".
Swift 2.x позволяет это с помощью соответствия шаблону if: https://www.natashatherobot.com/swift-2-pattern-matching-with-if-case/
if case let .LoggedIn(name,password) = status {
print( "\(name) Logged in!" )
}
В это время (iOS8 Beta 4) вам кажется, что вам нужно полностью качественно присвоить значение перечисления при сравнении ==.
OK
if (taskSortOrder == TaskSortOrder.Name) {
...
}
Ошибка: "TaskSortOrder" не конвертируется в "Селектор"
if (taskSortOrder == .Name) {
...
}
Это также происходит в моем примере перечисления, но я использую тип Int
enum DisplayFunctionKey : Int {
case Auto, A, B, C, D, E, F, G, H
}
var key : DisplayFunctionKey = .Auto;
if key == .Auto { /* do your stuff */ } // gives error
Но!... как ни странно, используя оператор не в операторе if с сопроводительным другим, он работает:
if key != .Auto {} else { /* do your stuff */ } // this works
Это своего рода уродливое, но, скорее, еще одно, чем вся недвижимость для переключения всего на одну линию.
Вы должны использовать оператор switch с перечислениями.
switch task order {
case .Name:
...
default:
break
}