2016-11-04 4 views
3

式1と2の間のコンパイラの見解との違いは何ですか?(下記のコードをご覧ください) Swift 3以降、複数のパラメータをタプルの形で関数に渡すことはできません。最初の式はどのように動作しますか?Swift 3のクロージャ略記構文

func f(_ x: Int, _ y: Int) -> Int { 
    return x + y 
} 

// expression 1: compiles 
[(1, 2)].map(f) 

// expression 2: doesn't compile "Passing 2 arguments to a callee as a single tuple value has been removed in Swift 3" 
[(1, 2)].map { (t: (Int, Int)) -> Int in 
    return f(t) 
} 

答えて

4

根拠はproposal that removed itに説明されています。 2番目のケースでは微妙な問題が発生しましたが、最初のケースでは問題になりませんでした。そして、ほとんどの場合と同様に、なぜコンパイラはここでエラーを投げないのですか?答えは「それがそれを妨げないので」です。それは必ずしも仕事に深い意図があったということではありません。それは働くことが妨げられていないために働くこともあります。

しかし、これは最初の例では実際に特殊なケースではないこともあります。 2番目の例では

func f(x: Int, y: Int) -> Int { ... } 
[(1, 2)].map(f) 

、それはタプルラベルがタイプの一部ではないという事実に直面して実行されますので、現在は存在しないので、仕事に使用しませんでした:これはラベルで、あまりにも、動作します正しく表現する方法です(これは微妙な問題の1つです)。参照:

を関数型言語で共通の特徴であるが、スウィフトは関数型言語ではない、1であることを意図していないことに注意することが重要であり、 Swift 3のいくつかの既存機能機能を削除して、言語をより一貫したものにしています(最も有名なのは、Curry構文です。 f()を定義したやり方は、Swiftのような極端なun-swiftのようなものです。スウィフトはそのようなことを許しますが、それに応えません。 Swiftチームは、この構文が有用である例を聞きたくて、Swift開発者が遭遇する可能性が高い一般的な問題にマップしています(このような例が提示されていれば、あなたが例を持っている場合は、スレッドがこれについて議論するためのevo-proposalを参照してください。

広く、Swiftのタプルは弱いソースです。彼らは実際の "匿名の構造体"としてあなたが期待するようには生きておらず、ほとんどファーストクラスの型です(例えば、それらに拡張機能を付けることはできません)。タプルを改善するためのいくつかの提案がありますが、Swift 3では、非常に単純な使い方を超えて非常に強力なツールではありません。

+0

答えをありがとう。要約する。 "タプルスプラット"フォームがサポートされていない理由があります。それは明らかです。 '[(1,2)] .map(f)'は実装が簡単だったので動作しますか? :) –

+1

既に実装されているので、実装が簡単だったので、私は言うつもりはありません。彼らはそれを取り出した。しかし、たぶん「正しく動作させるために*実装するのは簡単だったから」また、関数形式を削除すると、関数を使って直接mapを呼び出すことは基本的に不可能になりました。あなたはいつもクロージャーを使わなければなりません。クロージャを使用すると、スプラットではなくパラメータを書き出すことができるようになります。 –

関連する問題