Если не пустить - в 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")
Другой вариант, который я использовал несколько раз:
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)
...
}