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(_:)
似乎在Sets上不起作用,因此我决定在操场上变聪明并尝试:
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(_ :)的任何想法?谢谢大家
更新: Swift 2和3进行了很多更改。的通用占位符Set
现在Element
是T
,而不是,并且所有集合都有一个map()
返回
数组 的方法 。
对于Set -> Set
映射的问题(例如,将不同的元素映射到相同的结果)也给出了很好的论据。另一方面,可能会有这种映射的用例,因此这是 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, 0, 2, 4, 1, 3]
(旧答案:) 您快到了。由于某些原因,必须显式指定返回集的通用类型:
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, 0, 2, 4, 1, 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
再次返回。优点可能是不创建任何中间数组。
问题内容: 今天打开了LinkedHashSet源代码,发现了一些有趣的东西: 问题是:为什么当HashSet已经是Set时,为什么它们既需要“ extends HashSet”又需要“ implements Set”? 问题答案: 我问过乔什·布洛赫(Josh Bloch),他告诉我这是一个错误。很久以前,他曾经认为其中有一些价值,但是他自从“看到了光”。显然,JDK维护人员认为以后不应该撤消此
扩展是专门设计的在 Yii 应用中随时可拿来使用的, 并可重发布的软件包。例如, yiisoft/yii2-debug 扩展在你的应用的每个页面底部添加一个方便用于调试的工具栏, 帮助你简单地抓取页面生成的情况。 你可以使用扩展来加速你的开发过程。 信息: 本文中我们使用的术语 "扩展" 特指 Yii 软件包。而用术语 "软件包" 和 "库" 指代非 Yii 专用的通常意义上的软件包。 使用扩展
vscode-react-native vscode-go
扩展为现有的类、结构体、枚举类型、或协议添加了新功能。这也包括了为无访问权限的源代码扩展类型的能力(即所谓的逆向建模)。扩展和 Objective-C 中的分类类似。(与 Objective-C 的分类不同的是,Swift 的扩展没有名字。) Swift 中的扩展可以: 添加计算实例属性和计算类型属性; 定义实例方法和类型方法; 提供新初始化器; 定义下标; 定义和使用新内嵌类型; 使现有的类型遵
概述 范例-hello-world 范例-word-count 范例-language-server 范例-调试器 调试-扩展 安装-扩展 范式-原则 测试-扩展 用我们的方法创造扩展
本页包含内容: 扩展语法 计算型属性 构造器 方法 下标 嵌套类型 扩展就是向一个已有的类、结构体或枚举类型添加新功能(functionality)。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模)。扩展和 Objective-C 中的分类(categories)类似。(不过与Objective-C不同的是,Swift 的扩展没有名字。) Swift 中的扩展可以: 添加计算型属