我想创建一个通常用于函数式编程的通用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] 举报,一经查实,本站将立刻删除。