Swift基礎文法(オプション)

3787 ワード

オプション:
オプション(optionals)を使用して、値が欠落する可能性がある場合を処理します.オプション:
  • は値があり、x
  • に等しい.
    または
  • 値なし
  • 例を見てみましょう.SwiftのStringタイプにはtoIntという方法があり、String値をInt値に変換する役割を果たします.しかし、すべての文字列が整数に変換できるわけではありません.文字列「123」は数値123に変換できますが、文字列「hello,world」はできません.
    次の例では、toIntメソッドを使用して、StringをIntに変換しようとします.
    let possibleNumber = "123"
    let convertedNumber = possibleNumber.toInt()
    // convertedNumber        "Int?",      "optional Int"

    TOIntメソッドは失敗する可能性があるため、Intではなくオプション(optional)Intを返します.オプションのIntはIntと書きます.Intではありません.疑問符は、Int値がオプションであることを示します.つまり、Int値が含まれている可能性もあるし、値が含まれていない可能性もあります.(Bool値やString値などの他の値は含まれません.Intまたは何もありません.)
    if文および強制解析
    if文を使用して、オプションに値が含まれているかどうかを判断できます.オプションで値がある場合、結果はtrueです.値がない場合はfalseになります.オプションパッケージに値が含まれていると判断したら、オプションの名前の後ろに感嘆符(!)を付けることができます.に表示されます.この驚嘆符は「このオプションに値があることは知っています.使用してください.」これはオプション値の強制解析(forced unwrapping)と呼ばれます.
    if convertedNumber {
        println("\(possibleNumber) has an integer value of \(convertedNumber!)")
    } else {
        println("\(possibleNumber) could not be converted to an integer")
    }
    //    "123 has an integer value of 123"

    オプションのバインド
    オプションバインド(optional binding)を使用して、オプションに値が含まれているかどうかを判断し、含まれている場合は一時定数または変数に値を割り当てます.オプションバインドはif文およびwhile文でオプションの値を判断し、定数または変数に値を割り当てることができます.
    次のようにif文にオプションのバインドを書きます.
    if let constantName = someOptional { statements }

    上記のようにオプションバインディングを使用してpossiblenumberという例を書き換えることができます.
    if let actualNumber = possibleNumber.toInt() {
        println("\(possibleNumber) has an integer value of \(actualNumber)")
    } else {
        println("\(possibleNumber) could not be converted to an integer")
    }
    //    "123 has an integer value of 123" 

    このコードは、「possibleNumber.toIntが返すオプションのIntに値が含まれている場合、actualNumberという新しい定数を作成し、オプションの値を割り当てる」と理解できます.
    変換に成功した場合、actualNumber定数はif文の最初のブランチで使用できます.オプションで含まれる値は初期化されているので、これ以上使用する必要はありません.接尾辞を使用して値を取得します.この例では、actualNumberは変換結果を出力するためにのみ使用される.定数と変数は、オプションのバインドで使用できます.if文の最初のブランチでactualNumberの値を操作したい場合は、if var actualNumberに変更すると、オプションで含まれる値が変数に非常に多く割り当てられます.
    nil
    オプションの変数にnilを割り当てて、値がないことを示します.
    var serverResponseCode: Int? = 404  // serverResponseCode         Int   404
    serverResponseCode = nil // serverResponseCode       

    オプションの定数または変数を宣言しても値が割り当てられていない場合は、自動的にnilに設定されます.
    var surveyAnswer: String? // surveyAnswer        nil

     
    暗黙解析オプション
    前述したように、定数または変数が「値なし」であることを任意に示す.オプションif文で値があるかどうかを判断し、値があればオプションバインドで値を解析できます.プログラム・アーキテクチャでは、最初に値が割り当てられた後、オプションが常に値を持つことを決定することがあります.この場合、オプション値が常に値があると判断し、解析するたびに非常に効果的ではありません.このタイプのオプションは、暗黙解析オプション(implicitly unwrapped optionals)として定義されます.オプションとして使用したいタイプの後の疑問符(String?)を感嘆符(String!)に変更して暗黙解析オプションを宣言します.オプションが最初に値を付与された後、その後ずっと値があると判断できる場合、暗黙解析オプションは非常に役立ちます.
    暗黙的な解析オプションは、通常のオプションですが、非オプションとして使用できます.毎回解析を使用してオプション値を取得する必要はありません.次の例では、オプションStringと暗黙的解析オプションStringの違いを示します.
    let possibleString: String? = "An optional string."
    println(possibleString!) //          
    //    "An optional string."
    let assumedString: String! = "An implicitly unwrapped optional string."
    println(assumedString) //       
    //    "An implicitly unwrapped optional string."

    暗黙的な解析オプションを自動的に解析できるオプションとすることができます.あなたがしなければならないのは、宣言するたびに感嘆符をタイプの末尾に置くだけで、値を取るたびに選択可能な名前の末尾ではありません.
    暗黙的な解析オプションを通常のオプションとして、値が含まれているかどうかを判断することができます.
    if let definiteString = assumedString { 
        println(definiteString) 
    } 
    //    "An implicitly unwrapped optional string." 

     
    if assumedString {
        println(assumedString) 
    }
    //    "An implicitly unwrapped optional string."