Swift地图(_ :)扩展为Set()?

前端之家收集整理的这篇文章主要介绍了Swift地图(_ :)扩展为Set()?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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]

猜你在找的Swift相关文章