「if let」を迅速に無効にする方法はありますか?これは私には愚かに見えます:
if let type = json.type {
} else {
XCTFail("There is no type in the root element")
}
Json.typeは列挙型であるため、XCTAssertNotNilは使用できません。
enum JSONDataTypes {
case Object
case Array
case Number
case String
}
どうもありがとう
編集:それは:
var type: JSONDataTypes? = nil
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
のようなもの、または決して返さないことがコンパイラーに知られている関数(つまり、abort()
のような注釈付き@noreturn
)で終わる必要があります。 ..それにXCTFail
が含まれているかどうかはわからないが、( そうでなければバグを報告する ).
詳細については、「 早期終了 inThe Swift Programming Language」を参照してください。
本当に古いものについては... 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)
...
}