我是Swift的新手并试图编写我的第一个调用用户传入的闭包的函数。我无法调用我的函数(我将其命名为fun)。我也无法在网上找到任何这方面的例子。我只是想调用我的闭包(我不确定要传递给它的什么?)然后根据布尔结果做出决定?这似乎很容易,但我不确定。
该方法的目标是根据用户规范删除阵列中的重复项。在我的情况下,我可能想要传入某个类及其数组,然后删除所有具有相同名称属性的类(即匹配的名称字符串)。
extension Array{
func removeDuplicates<T: Comparable>(fun: (elem: T, arr: [T]) -> Bool) -> [T]
{
var array = [T]()
for element in self
{
if fun(elem: T(), arr: [T])
{
println("hello")
}
}
return array
}
}
答案 0 :(得分:3)
这是Does there exist within Swift's API an easy way to remove duplicate elements from an array?的略微概括,可能就是你的样子 寻找:
extension Array {
func withoutDuplicates<U : Hashable>(attribute : T -> U) -> [T] {
var result : [T] = []
var seen : Set<U> = Set()
for elem in self {
let value = attribute(elem)
if !seen.contains(value) {
result.append(elem)
seen.insert(value)
}
}
return result
}
}
attribute
闭包应用于每个数组元素,和
Set
用于跟踪已经发生的值。
因此,值类型U
必须为Hashable
(其中
是字符串的情况。)
示例:
struct Person : Printable {
let firstName : String
let lastName : String
var description: String {
return "\(firstName) \(lastName)"
}
}
let array = [
Person(firstName: "John", lastName: "Doe"),
Person(firstName: "Joe", lastName: "Miller"),
Person(firstName: "Jane", lastName: "Doe")
]
let result = array.withoutDuplicates( { $0.lastName } )
println(result)
// [John Doe, Joe Miller]
另一种实现方式是
func withoutDuplicates<U : Hashable>(attribute : T -> U) -> [T] {
var seen : [U : Bool] = [:]
return self.filter { seen.updateValue(true, forKey: attribute($0)) == nil }
}
利用了updateValue()
Dictionary
方法的事实
返回键的先前值,特别是如果之前未设置键,则返回nil
。这也只是对@ rintaro对iOS Swift: Filter array to unique items的回答的略微概括。