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]

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...