用参数调用Swift闭包

时间:2015-06-07 13:54:05

标签: ios swift

我是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
    }


}

1 个答案:

答案 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的回答的略微概括。