2017-01-31 16 views
1

私は素早く勉強していますが、_記号は私に大きな問題をもたらしています。アップルの書籍「速やかなアプリ開発」レッスンでは、構造を構築することを学びます。無名のパラメータを表し、_文字列を使用したために:私は_を使用しての違いを理解しようとしています(?おそらく別の無名のパラメータが、我々はそれに名前を与えている)何かを表現するために_:vs _ St​​ringの相違点/用途:関数を書くとき

をここに私のコード例です:

struct Rectangle { 
     let width: Int 
     let height: Int 
     var area: Int { 
      return width*height 
     } 

func biggerThan(_ rectangle: Rectangle) -> Bool { 
    return area > rectangle.area 
    } 
} 

私の主な質問と同じ行に沿って、なぜこの関数が(_ rectangle: Rectangle)または(_:Rectangle)のどちらかとして記述されているのは、コードの戻り行を変更することなく理解できません。

+0

本文に 'rectangle'を使用すると'(_ rectangle:Rectangle) 'から'(_:Rectangle) 'に変更するとコードがコンパイルされません。 – Hamish

+0

ハミッシュ、私もそれはwouldntだと思った。 Xcodeのプレイグラウンドはコンパイルされても大丈夫です。単語の矩形は白から緑に変わりましたが、期待どおりにコードを実行します。 –

+0

遊び場で試してはいけません。とてもバグがあり、信頼性がありません。実際のプロジェクトでそれをテストすると、コンパイルされていないことがわかります。 – Hamish

答えて

3

Swiftバージョンの問題が発生している可能性があります。スウィフト3では、2つの構文のいずれかが必要です。

func foo(bar:String, bar2:Int) { 
} 

func foo(_ bar:String, bar2:String) { 
} 

func foo(bar:String, _ bar2:String) { 
} 

func foo(_ bar:String, _ bar2:Int) { 
} 

そして、この機能に対応する呼び出しは、次のとおりです。つまり

foo(bar: "Hello World", bar2: 1) 
foo("Hello World", bar2: 1) 
foo(bar: "Hello World", 1) 
foo(bar: "Hello World", 1) 

、および署名にアンダースコアは、あなたがそれを宣言しないことを意味しますコール。スウィフトのすべての以前のバージョンでは、最初のパラメータで

しかし対応する呼び出しを行う、暗黙のアンダースコアを持っています

foo("Hello World", bar2: 1) 
foo("Hello World", bar2: 1) 
foo("Hello World", 1) 
foo("Hello World", 1) 

はまた、あなたがいないと明示的に宣言をするアンダースコアを考慮することができる一方であることに注意してください

foo(bar myBar:String, bar2 myBar2:Int) { 
    // internally refer to myBar and myBar2, not bar and bar2 
} 

を、コールは次のとおりです:名前を使用し、あなたも物事の名前を変更することができます

foo(bar: "Hello World", bar2: 1) 
+0

ありがとう、私のための状況をクリアする非常にdfd –

関連する問題