2017-07-06 10 views
9

Xcodeの9閉鎖タプルは

でSwift4用光沢プロジェクト

私は私は考え

閉鎖タプルキーパラメータ「(持っていない、次のエラー取得していた後Xcode9 Swift4で非構造をサポートしていません:_を、値:

:_)」は 非構造

コードをサポートしていません。

エラーがtry flatMap({ (key, value)in

+0

'Dictionary.init(エレメント:)'スイフト標準ライブラリで見つけることができません。あなたはそれを自分で定義しますか? – OOPer

+0

はい、回答を更新しています –

+0

回答を更新しました –

答えて

9

はのは以下の通りです辞書用flatMapの定義から始めましょう、この時点で来る:

func flatMap(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult] 

あなたはtransform閉鎖タイプの唯一つのパラメータを取ることがわかりここで、Elementはタプルの場合にはtypealiasです。

public typealias Element = (key: Key, value: Value) 

したがって、最初及びクロージャの唯一引数は、二つの要素(タイプKey及びタイプValuevaluekey)のタプルであるべきです。あなたは(スウィフト3でコンパイル)あなたのコードを見れば


さて、あなたはこのようなケースではないことがわかります、あなたは、これがさえ

スウィフト3で動作しない理由を尋ねるべきです
try flatMap({ (key, value) in 
    return try transform(key, value) 
}) 

クロージャーには、1つではなく2つの引数(keyタイプKeyおよびvalueタイプValue)が必要です。これは、と呼ばれる機能のおかげで、Swift 3で動作します。の場合、コンパイラは2要素のタプルを2つの引数に自動的に変換します。

しかし、この機能はほとんど使用されない、奇妙である、それは4
編集スウィフトで削除されましたので、予想外の結果、ほとんどの時間を与える:OOPerで指摘したように、この機能を一時的に削除されましたスイフト4ベータ版ですが、最終版が出る前に再追加する必要があります。

代わりにあなたが書いてする必要があります。

try flatMap({ tupleArgument in 
    return try transform(tupleArgument.key, tupleArgument.value) 
}) 

そして、あなたのflatMap機能は、次のようになります。

​​:

func flatMap<KeyPrime, ValuePrime>(_ transform: (Key, Value) throws -> (KeyPrime, ValuePrime)?) rethrows -> [KeyPrime:ValuePrime] { 
    return Dictionary<KeyPrime, ValuePrime>(elements: try flatMap({ element in 
     return try transform(element.key, element.value) 
    })) 
} 
+0

説明をありがとうございます。それは私がswift4と互換性を持たせようとしている第三者図書館です。 –

3

それはスウィフト4のためのこの提案の副作用です。

しかし、一部の機能はこの提案に含まれてはevolution-announce mailing listのこの記事で扱われているいくつかの回帰原因:だから

[swift-evolution-announce] [Core team] Addressing the SE-0110 usability regression in Swift 4

を、あなたは将来のベータ版またはXcode9のGM版に期待することができ、あなたのコードはうまくコンパイルされます。 DictionarySequence(Key, Value)ペアで取るいくつかの新しい初期化子があり、スウィフト4で、ところで

internal func flatMap<KeyPrime , ValuePrime>(_ transform: (Key, Value) throws -> (KeyPrime, ValuePrime)?) rethrows -> [KeyPrime : ValuePrime] { 
    return Dictionary<KeyPrime,ValuePrime>(elements: try flatMap({ pair in 
     let (key, value) = pair 
     return try transform(key, value) 
    })) 
} 

:それまでは、回避策のこの種を使用することができます。例えば:

init(uniqueKeysWithValues: S)