Подтвердить что ты не робот

Если не считать - в Swift

есть ли способ свести на нет "если пусть" в swift? Это выглядит глупо для меня:

    if let type = json.type  {

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

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

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

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

EDIT: это:

var type: JSONDataTypes? = nil
4b9b3361

Ответ 1

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

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.


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

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

Ответ 2

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

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

Ответ 3

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

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)

    ...
}