arrays – Swift泛型数组函数,用于查找不匹配项的元素的所有索引
发布时间:2020-12-14 04:46:43 所属栏目:百科 来源:网络整理
导读:斯威夫特3 尝试编写一个通用数组扩展,获取不等于值的项的所有索引 例 let arr: [String] = ["Empty","Empty","Full","Full"] let result: [Int] = arr.indexes(ofItemsNotEqualTo item: "Empty") //returns [2,4] 我试图制作一个通用函数: extension Array
斯威夫特3
尝试编写一个通用数组扩展,获取不等于值的项的所有索引 例 let arr: [String] = ["Empty","Empty","Full","Full"] let result: [Int] = arr.indexes(ofItemsNotEqualTo item: "Empty") //returns [2,4] 我试图制作一个通用函数: extension Array { func indexes<T: Equatable>(ofItemsNotEqualTo item: T) -> [Int]? { var result: [Int] = [] for (n,elem) in self.enumerated() { if elem != item { result.append(n) } } return result.isEmpty ? nil : result } } 但是这会发出警告:二进制运算符不能应用于“Element”和“T”类型的操作数. 所以我在这里投了元素(注意为?) extension Array { func indexes<T: Equatable>(ofItemsNotEqualTo item: T) -> [Int]? { var result: [Int] = [] for (n,elem) in self.enumerated() { if elem as? T != item { result.append(n) } } return result.isEmpty ? nil : result } } 但现在似乎类型检查已经消失了,因为如果我传入一个整数,我得到错误的结果 let arr: [String] = ["Empty","Full"] let result: [Int] = arr.indexes(ofItemsNotEqualTo item: 100) //returns [0,1,2,3,4] 非常感谢帮助. 使用reduce函数有更好的方法吗? 解决方法
您已经定义了一个通用方法
func indexes<T: Equatable>(ofItemsNotEqualTo item: T) -> [Int]? 它采用类型为T的参数 因此 let arr = ["Empty","Full"] let result = arr.indexes(ofItemsNotEqualTo: 100) 编译,但是作为? T给出nil(这是!=项目) 你想要的是一个只为数组定义的方法 extension Array where Element: Equatable { func indexes(ofItemsNotEqualTo item: Element) -> [Int]? { var result: [Int] = [] for (n,elem) in enumerated() { if elem != item { result.append(n) } } return result.isEmpty ? nil : result } } 实际上我不会将返回值设为可选.
好吧,您可以使用reduce(),但这不是非常有效,因为在每个迭代步骤中都会创建中间数组: extension Array where Element: Equatable { func indexes(ofItemsNotEqualTo item: Element) -> [Int] { return enumerated().reduce([]) { $1.element == item ? $0 : $0 + [$1.offset] } } } 你实际拥有的是一个 extension Array where Element: Equatable { func indexes(ofItemsNotEqualTo item: Element) -> [Int] { return enumerated().filter { $0.element != item }.map { $0.offset } } } 可以使用flatMap()简化: extension Array where Element: Equatable { func indexes(ofItemsNotEqualTo item: Element) -> [Int] { return enumerated().flatMap { $0.element != item ? $0.offset : nil } } } 例子: let arr = ["Empty","Full"] arr.indexes(ofItemsNotEqualTo: "Full") // [0,3] [1,1].indexes(ofItemsNotEqualTo: 1) // [] arr.indexes(ofItemsNotEqualTo: 100) // error: cannot convert value of type 'Int' to expected argument type 'String' (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |