我是Swift的新手,我试图编写我的第一个函数,它调用用户传入的闭包。我很难调用我的函数(我把它命名为乐趣)。我在网上也找不到这方面的任何例子。我只想宣布我的结束(我不知道该怎么做?)然后根据布尔结果做出决定?这似乎很容易,但我不确定。
该方法的目标是根据用户规范删除数组中的重复项。在我的例子中,我可能想传递一个特定的类及其数组,然后删除所有具有相同名称属性的类(即匹配的名称字符串)。
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
}
}发布于 2015-06-07 14:55:00
这是对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的一个小小的概括。
https://stackoverflow.com/questions/30694324
复制相似问题