4

Apple docs によると、オプションのチェーンは次のとおりです。

オプションが非 nil の場合、プロパティ、メソッド、または添え字を呼び出したいオプション値の後に疑問符 (?) を置くことによって、オプションの連鎖を指定します。...オプションがnilの場合、オプションのチェーンは正常に失敗します...

これについての私の解釈は、次のような構造はオプションの連鎖であるということです:

someMasterObject.possiblyNilHandler?.handleTheSituation()

...そして、上記の行は、ハンドラーが nil でない場合は handleTheSituation メソッドを呼び出し、ハンドラーが nil の場合は正常に失敗します (行はスキップされます)。

ただし、オプションの連鎖について私が目にするほとんどすべての例は、次のように「if let」構造を使用しています。

if let handler = someMasterObject.possiblyNilHandler{
  handler.handleTheSituation()
}

実際、私がネット上で見つけたドキュメントと例では、オプションのチェーンに関連して「if let」構造を多用しているため、それがオプションのチェーンであるかのように見えます。

しかし、私の最初の例はオプションの連鎖のサポートされた使用であり、if let 構造はオプションの連鎖を使用する (または密接に結びついている) 別の構造であると仮定するのは正しいでしょうか?

4

3 に答える 3

11

if letオプションの連鎖は、単なるオプションのバインディング ( )よりも多くの場合に役立ちます。

person?.name = "Fred"              // assign "Fred" to name property if person is not nil

person?.congratulate()             // call congratulate method if person is not nil

let name = person?.name ?? "none"  // nil coalescing operator

let age = dict?["age"] ?? 0        // subscripting an optional variable

if var name = person?.name {       // optional binding using var instead of let
于 2015-01-01T21:39:09.707 に答える
6

結論は正しいです -let独立していますが、便利な構造です。コンテキストでは、if-body 内にのみバインディングを導入し、バインドされた値が nil でない場合にのみ if-body を実行します。(技術的には、オプションのバインディングをアンラップします。)

let右側の式 (連鎖の有無にかかわらず) の処理方法には影響しません。たとえば、someMasterObjectoptional/nil の場合、「チェーン」ではなく失敗しますlet。.

どちらか一方 (または両方) がより「正しい」場合は、状況によって異なります。連鎖しているものと是正措置はどうあるべきか。


たとえば、someMasterObjectnil の可能性がある場合、チェーンと の両方を使用する次のようになる可能性がありますlet。また、戻り値がどのように重要であり、単に破棄されるか、または「失敗時に nil」ではないことに注意してください。

if let handler = someMasterObject?.possiblyNilHandler{
  return handler.handleTheSituation()
} else {
  return FAILED_TO_CALL
}

次に、呼び出しに失敗した場合にのみ返される非同等の連鎖形式と比較しますが、 nil は!からの有効な戻り値である可能性があります。nilhandleTheSituation

return someMasterObject?.possiblyNilHandler?.handleTheSituation()

一方、ネストされた if-let ステートメントへの連鎖の直接的な変換が常にあることを考慮してください。

result_of_expression = someMasterObject?.possiblyNilHandle?.handleTheSituation()

if let master = someMasterObject {
   if let handler = master.possiblyNilHandler {
       result_of_expression = handler.handleTheSituation()
   } else {
       result_of_expression = nil
   }
} else {
   result_of_expression = nil
}
于 2015-01-01T21:05:55.743 に答える
1

オプションのチェーンを介してメソッドを呼び出すことは完全に問題ありません。それをif囲む必要はありません。オプションの値がnil呼び出し時に発生した場合、コードは例外をスローしません。ただし、メソッドが実行されたかどうかを確認することはできません。

ただし、通常if、メソッドが呼び出されたかどうかを検出するために、オプションの連鎖メソッド呼び出しの周りに配置する必要があります。

func printNumberOfRooms() {
    println("The number of rooms is \(numberOfRooms)")
}

if john.residence?.printNumberOfRooms() != nil {
    println("It was possible to print the number of rooms.")
} else {
    println("It was not possible to print the number of rooms.")
}

本の章へのリンク

nilこの例の関数には戻り値がありませんが、チェックは機能することに注意してください。オプションのチェーンを使用してオプションの値で呼び出されるため、型はVoid?, notVoidであり、比較が可能になります。

于 2015-01-01T21:08:04.290 に答える