加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 02:23:44 所属栏目:百科 来源:网络整理
导读:我想创建一个通常用于函数式编程的通用find().在函数式编程中,您不能使用数组索引和for循环.你过滤了.它的工作方式是,如果你有一个说清单 ["apple","banana","cherry"] 并且您想要找到banana,然后通过创建元组将数组索引分配给列表元素 [(1,"apple"),(2,"ban
我想创建一个通常用于函数式编程的通用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索引.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读