web-dev-qa-db-ja.com

させない場合-in Swift

「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
41
Peter Shaw

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

これのキャッチは、elseguard句がそのスコープを終了する必要があることです(そうでなければ、上記のtypeのように、保護された変数がバインドされていません)。そのため、returnbreakcontinueのようなもの、または決して返さないことがコンパイラーに知られている関数(つまり、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")
37
rickster

方法は次のとおりです。

if json.type == nil {
  // fail
}
23
Abhi Beckert

私が数回使用した別の選択肢:

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)

    ...
}
2
Can