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,2,4,1,3]” //Somehow elements is the Set are going missing.
任何关于如何扩展的想法可以使用map(_ :)可靠?
谢谢你们
你几乎在那里由于某种原因,通用类型的
必须明确指定返回的集合:
必须明确指定返回的集合:
extension Set { func map<U>(transform: (T) -> U) -> Set<U> { return Set<U>(Swift.map(self,transform)) } }
例:
let numberSet = Set(1...11) let divideSet = numberSet.map { $0 / 2 } println(divideSet) // [5,3]
由于整数除法,所得到的集合元素较少
$0/2截断商,例如4/2和5/2映射到
相同的元素2.这不会发生在浮点除法:
let floatdivideSet = numberSet.map { Double($0) / 2.0 } println(floatdivideSet) // [4.0,5.0,4.5,5.5,2.0,3.0,3.5,2.5,1.5,1.0,0.5]
另一个可能的实现是
extension Set { func map<U>(transform: (T) -> U) -> Set<U> { return Set<U>(lazy(self).map(transform)) } }
这里lazy(self)返回一个LazyForwardCollection
一个map()方法,并再次返回一个LazyForwardCollection.
优点可能是没有创建中间数组.
更新:Swift 2和3改变了很多.通用
Set的占位符现在是Element而不是T,而所有
集合具有返回数组的map()方法.
还有一些很好的论据,关于一个集合的问题 – >设置映射(如不同的元素映射到相同的结果).
另一方面,这种映射可能存在用例,
所以这里是Swift 3的更新(现在使用不同的名称).
extension Set { func setmap<U>(transform: (Element) -> U) -> Set<U> { return Set<U>(self.lazy.map(transform)) } }
例:
let numberSet = Set(1...11) let divideSet = numberSet.setmap { $0 / 2 } print(divideSet) // [5,3]