Xcodeの9閉鎖タプルは
でSwift4用光沢プロジェクト私は私は考え
閉鎖タプルキーパラメータ「(持っていない、次のエラー取得していた後Xcode9 Swift4で非構造をサポートしていません:_を、値:
:_)」は 非構造
コードをサポートしていません。
エラーがtry flatMap({ (key, value)in
Xcodeの9閉鎖タプルは
でSwift4用光沢プロジェクト私は私は考え
閉鎖タプルキーパラメータ「(持っていない、次のエラー取得していた後Xcode9 Swift4で非構造をサポートしていません:_を、値:
:_)」は 非構造
コードをサポートしていません。
エラーがtry flatMap({ (key, value)in
はのは以下の通りです辞書用flatMap
の定義から始めましょう、この時点で来る:
func flatMap(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
あなたはtransform
閉鎖タイプの唯一つのパラメータを取ることがわかりここで、Element
はタプルの場合にはtypealias
です。
public typealias Element = (key: Key, value: Value)
したがって、最初及びクロージャの唯一引数は、二つの要素(タイプKey
及びタイプValue
のvalue
のkey
)のタプルであるべきです。あなたは(スウィフト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)
}))
}
説明をありがとうございます。それは私がswift4と互換性を持たせようとしている第三者図書館です。 –
それはスウィフト4のためのこの提案の副作用です。
しかし、一部の機能はこの提案に含まれてはevolution-announce mailing listのこの記事で扱われているいくつかの回帰原因:だから
[swift-evolution-announce] [Core team] Addressing the SE-0110 usability regression in Swift 4
を、あなたは将来のベータ版またはXcode9のGM版に期待することができ、あなたのコードはうまくコンパイルされます。 Dictionary
はSequence
(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)
}))
}
:それまでは、回避策のこの種を使用することができます。例えば:
'Dictionary.init(エレメント:)'スイフト標準ライブラリで見つけることができません。あなたはそれを自分で定義しますか? – OOPer
はい、回答を更新しています –
回答を更新しました –