TL; DR
なぜこれは機能しませんか?私はスウィフトに好きmap()内のinit()の使用
"abcdefg".characters.map(String.init) // error: type of expression is ambiguous without more context
詳細
一つは本当にクールなことは、(存在するそのタイプのinit()
を想定)initメソッドに渡すことにより、別のもののコレクションを変換する機能です。
ここでは、タプルのリストをClosedInterval
のインスタンスに変換する例を示します。例はまた、我々は限りタプルは関数の引数リストと一致するように、単一の引数として、引数のタプルを渡すことができるという事実を利用すること
[(1,3), (3,4), (4,5)].map(ClosedInterval.init)
。
この例では、数値のリストを文字列インスタンスに変換する別の例を示します。
(1...100).map(String.init)
残念ながら、次の例は機能しません。ここでは、文字列を1文字の文字列のリストに分割しようとしています。
"abcdefg".characters.map(String.init) // error: type of expression is ambiguous without more context
map()
はCharacter
のリスト上で動作すべきである(実際に私はスイフトはここmap
に渡される[文字]の正しいタイプを推論遊び場に確認することができました)。
String
は、Character
から明確にインスタンス化できます。
let a: Character = "a"
String(a) // this works
興味深いことに、これは文字がそれぞれ独自の配列にある場合に有効です。
"abcdefg".characters.map { [$0] }.map(String.init)
または同等:
let cx2: [[Character]] = [["a"], ["b"], ["c"], ["d"]]
cx2.map(String.init)
私はこれを行うことができることを知っている:
"abcdefg".characters.map { String($0) }
しかし、私は特にIMOこの構文は次のとおりです("abcdefg".characters.map(String.init)
が動作しない理由を理解しようとしていますまた、読みやすくエレガント)
これは優れた答えです。このように '.init'を使用することを記述しているリファレンスドキュメント(または記事など)はありますか(たとえば、map/flatMapなど)? –
2つの初期設定を明確にすることができます。 'String.init(_ :)'を使って最初のものを参照してください。 – Sweeper