微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 使用函数式编程查找()

我想创建一个通常用于函数式编程的通用find().在函数式编程中,您不能使用数组索引和for循环.你过滤了.它的工作方式是,如果你有一个说清单
["apple","banana","cherry"]

并且您想要找到banana,然后通过创建元组将数组索引分配给列表元素

[(1,"apple"),(2,"banana"),(3,"cherry")]

现在,您可以过滤到“banana”并返回索引值.

我试图为此创建一个通用函数,但我收到一个错误.这个语法出了什么问题?

func findInGenericIndexedList<T>(indexedList: [(index: Int,value: T)],element: (index: Int,value: T)) -> Int? {        
    let found = indexedList.filter {   // ERROR: Cannot invoke 'filter' with an argument list of type '((_) -> _)'

        element.value === $0.value
    }

    if let definiteFound = found.first {
        return definiteFound.index
    }
    return nil
}

更新1:我想使用上面的解决方案而不是使用find()(将被弃用)或者使用Swift 2.0 indexOf(),因为我试图遵循功能编程范例,依赖于通用函数而不是类方法.

进行此项工作所需的最小更改是使T符合Equatable并使用==运算符.
func findInGenericIndexedList<T:Equatable>(indexedList: [(index: Int,value: T)) -> Int? {
    let found = indexedList.filter {
        element.value == $0.value
    }

    if let definiteFound = found.first {
        return definiteFound.index
    }
    return nil
}

在这里使用===并没有什么意义,因为通常会将它应用于值类型(特别是如果你遵循功能范例),这是永远不会的.

除此之外我花了一些时间思考问题,这就是我要做的事情:

extension Array where Element : Equatable {
    func find(element:Array.Generator.Element) -> Int? {
        let indexedList = lazy(self.enumerate())
        let found = indexedList.filter {
            element == $1
        }

        let definiteFound = found.prefix(1)
        return definiteFound.generate().next()?.index
    }
}

Array上的协议扩展,因为它使语法更整洁,懒惰的序列避免检查每个元素,0索引.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐