【问题标题】:Calling Swift closure with parameters使用参数调用 Swift 闭包
【发布时间】:2015-06-07 13:54:04
【问题描述】:

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


}

【问题讨论】:

  • 对不起,它是数组扩展的一部分。所以你可以在你选择的任何数组上调用这个方法。我更新了代码块。
  • 我还没有看到你真正想要实现的目标。在任何情况下,您不能编写仅适用于受限类型元素(即仅适用于 Comparable 的数组)的数组扩展方法。请参阅stackoverflow.com/questions/24938948/…stackoverflow.com/questions/27350941/…
  • 另外,这听起来不像是要删除重复项,而只是过滤。在这种情况下,只需使用原生的filter 方法即可。
  • 是的,没错,我的解释是错误的。我真的只想返回一个不包含我指定的属性重复的数组。

标签: ios swift


【解决方案1】:

这是对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 }
}

它利用了DictionaryupdateValue() 方法这一事实 返回键的先前值,特别是如果先前未设置键,则返回 nil。这也只是对@rintaro 对iOS Swift: Filter array to unique items 的回答的一个小小的概括。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2019-01-07
    相关资源
    最近更新 更多