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索引. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |