14
  let numberSet = Set(1...11)
  let divideSet = numberSet.map({  $0 / 10 }) 
  //Error: Set does not have a member named map   :(

Swift 1.2 はSet()順序付けられていないコレクションをサポートしていますmap(_:)が、セットでは機能しないようです。

 let stringSet = Set(map(numberSet, { String($0)}))
 println(stringSet)
 stringSet =  ["2", "11", "1", "8", "6", "4", "3", "9", "7", "10", "5]

これはうまくいくように見えました。だから私は Set を拡張しようとしました:

    extension Set {
        func map<U>(transform: (T) -> U) -> Set<U> {
        return Set(Swift.map(self, transform))  }
    }
   Error: "couldn't find initialiser for Set(T) that accepts argument of type U"

そして、この例のように、うまくいかないのには十分な理由があると思います:

   let smarDividSet = Set(map(numberSet, {$0 / 2})) 
   println(smarDividSet)
   smartDividSet = "[5, 0, 2, 4, 1, 3]” 
  //Somehow elements is the Set are going missing.

set を拡張して map(_:) を確実に使用する方法についてのアイデアはありますか? みんなありがとう。

4

4 に答える 4

9

の問題Set.map(_:)は と同じであり、実際に実装する正しい方法がないDictionary.map(_:)ため、Swiftモジュール (標準ライブラリ)に実装しませんでした。その理由は次のとおりです。 ping は列挙するだけではなく ( a のany で実行できます)、各値を別の値に変換します (引数クロージャを使用)。したがって、結果にはすべてが含まれていると予想されますが、値が同じ場合、それらは崩壊します ( s の場合、キーのみがこのように動作します)。mapSequenceTypefor-intransform(element)Dictionary

例(提案された実装を使用) Set([1, 2, 3, 4, 5]).map { 1 }.count == 1

これが、引数として渡された/と同じ型ではなく をSwift.map返す理由でもあります。ArraySequenceTypeCollectionTypesource

少し余談ですが、Dictionary(前に述べたように)キー値(基本的にはSet)に同じ問題があるためmapSet<K>または でSet<(K, V)>機能するものは一貫したマッピングを保証しませんが、値のみを変更するものは次のようになりますわかった。mapただし、Dictionarys は値だけではなくタプルのコレクションであるため、これは当てはまりません。したがって、正しいものに似たものがある可能性がありmapValuesますが、それでもmapコレクションには当てはまりません.

TL;DR

mapは非常に便利ですが、実際にはfrom to を実行できないため、実際に行っていることに注意してくださいmapSetSet

于 2015-04-20T11:37:55.400 に答える
1

Swift 2.0 の時点で、CollectionTypeプロトコル (によって実装Set) にはmapメソッドがあります。

于 2015-11-04T09:19:24.887 に答える