Если не пустить - в Swift

Есть ли способ отрицать "если позволено" в быстрой? Это выглядит глупо для меня:

    if let type = json.type  {

    } else {
        XCTFail("There is no type in the root element")
    }

Я не могу использовать XCTAssertNotNil, потому что json.type это enum.

enum JSONDataTypes {
    case Object
    case Array
    case Number
    case String
}

большое спасибо

РЕДАКТИРОВАТЬ: это:

var type: JSONDataTypes? = nil

3 ответа

Решение

Swift 2.0 (Xcode 7) и более поздние guard оператор, который работает как "если не позволено" - вы можете условно связать переменную в оставшейся части объема, оставляя "хороший путь" в вашем коде с наименьшим отступом.

guard let type = json.type else {
    XCTFail("There is no type in the root element")
}
// do something with `type` here

Уловка в том, что else пункт о guard должен выйти из этой области (потому что в противном случае вы попали бы в код после этого предложения, где защищенные переменные, такие как type выше, не связаны). Так что это должно закончиться чем-то вроде return, break, continue или функция, которая известна компилятору, чтобы никогда не возвращать (т.е. аннотированная @noreturn, лайк abort()... я не припомню, если это включает XCTFail, но это должно ( подать ошибку, если это не так).

Подробнее см. " Ранний выход" на языке программирования Swift.


Что касается действительно старых вещей... В Swift 1.x нет отрицательной формы if-let. Но так как вы все равно работаете с XCTest, вы можете просто сделать тестирование необязательной частью выражения утверждения:

XCTAssert(json.type != nil, "There is no type in the root element")

Вот как вы это делаете:

if json.type == nil {
  // fail
}

Другой вариант, который я использовал несколько раз:

switch json.type
{
    case .None: // ...
    case .Some(.Object): // ...
    case .Some(.Array):  // ...
    case .Some(.Number): // ...
    case .Some(.String): // ...
}

Так как ? на самом деле Optional<T> который является перечислением сам по себе, определяется как:

enum Optional<T> : Reflectable, NilLiteralConvertible 
{
    case None
    case Some(T)

    ...
}
Другие вопросы по тегам