2016-07-14 21 views
4

私は迅速に初心者ですので、これは間違いなく初心者レベルの質問です。私は潜在的なエラーに気づいたSwift 3.0のドキュメントを熟考していました。私は、例が間違っている(あいまいである)のか、実際にはいくつかのガイドラインに欠けているのだろうかと思います。Swift 3.0 Optional Chaining

http://swiftdoc.org/v3.0/type/Optional/を参照してください。

安全ポストフィックスオプションチェーン演算子(?)を使用して、ラップされたインスタンスのプロパティとメソッドにアクセスする

連鎖OPTIONAL。次の例では、オプションの連鎖を使用してString?インスタンスのhasSuffix(_:)メソッドにアクセスします。

if let isPNG = imagePaths["star"]?.hasSuffix(".png") { 
    print("The star image is in PNG format") 
} 
// Prints "The star image is in PNG format" 

AFAIU、imagePaths["star"]?.hasSuffix(".png")だけ安全にimagePathsのラップを解除し、Optional.some(wrapped)imagePaths["star"]結果場合のみhasSuffix()を実行することになっています。これは、isPNGtrueまたはfalseのいずれかになることを意味します。したがって、上記のサンプルの含意は、これが安全にアンラップすると値が常にtrueであることを暗黙的に主張するところでは間違っています。ここで

は、私が何を言っているかを説明するためにいくつかの例です:

if let isPNG = imagePaths["star"]?.hasSuffix(".png") { 
    print("The star has png format") 
} else { 
    print("The star does not have png format") 
} 

if let isPNG = imagePaths["portrait"]?.hasSuffix(".png") { 
    print("The portrait has png format") 
} else { 
    print("The portrait does not have png format") 
} 
// "The portrait has png format\n" 

if let isPNG = imagePaths["alpha"]?.hasSuffix(".png") { 
    print("The alpha has png format") 
} else { 
    print("The alpha does not have png format") 
} 
// "The alpha does not have png format\n" 

私の現在の分析が間違っている場合やSwiftDoc.orgは、この特定の例を変更する必要がある場合、私は単純に疑問に思って。

+2

のために私は同意するものとします。マニュアルが正しくありません。もし、ifPNG = imagePaths ["star"] ?. hasSuffix( ".png")ここでisPNG {...} 'または' imagePaths ["star"] ?. hasSuffix( " .png ")== true {...}'。しかし、その例は間違っています。 – Rob

+3

...'img = imagePaths [" star "] img.hasSuffix(" .png "){...}'のようにします。 – dfri

+0

この例は、実際にはAppleのドキュメント、https://developer.apple.com/reference/swift/optional(https://github.com/apple/swift/blob/master/stdlib/public/core/Optionalから生成されています)にあります。迅速に)、誰かがバグレポートを提出する必要があります。 –

答えて

5

あなたの分析が正しいこと、およびSwiftDoc.orgの例では、少なくとも 次のコードが示すように、誤解を招くです:

let imagePaths = ["star": "image1.tiff"] 

if let isPNG = imagePaths["star"]?.hasSuffix(".png") { 
    print("The star has png format") 
} else { 
    print("The star does not have png format") 
} 

// Output: The star has png format 

imagePaths["star"]?.hasSuffix(".png") 

nilでない場合は、オプションの結合に成功しましたオプションの連鎖を実行できる場合は です。つまり、imagePaths["star"] != nilの場合です。全ての状況をテストするため

正しい方法は、これは、様々な方法(NIL-合体演算子、パターンマッチング、...)に簡略化することができる。もちろん

if let isPNG = imagePaths["star"]?.hasSuffix(".png") { 
    if isPNG { 
     print("The star has png format") 
    } else { 
     print("The star does not have png format") 
    } 
} else { 
    print("No path in dictionary") 
} 

あろう。例

switch(imagePaths["star"]?.hasSuffix(".png")) { 
case true?: 
    print("The star has png format") 
case false?: 
    print("The star does not have png format") 
case nil: 
    print("No path in dictionary") 
} 

または

let isPNG = imagePaths["star"]?.hasSuffix(".png") ?? false 

(質問へのコメントでより多くの例。)

+0

それは今、多くの意味があります。最終的なコードは私が最後に思いついたものです。ありがとう。 – p0lAris

-3

私はBoolとOptionalを混在させていると思います。それらは同じではありませんが、いくつかの状況では、nilはfalseのように動作します。

+0

私は 'SwiftDoc.org'の例を解釈し、上記のように他の例を作成しようとしました。私が作成した例が有効であるという確信があります。だから、それは元の例そのものとそれが暗示しようとしている問題のように見えます。 – p0lAris