我想编写遍历数组的函数,并返回找到该元素的索引。
类似的东西:
StimLabel
然而,我没有成功。我怎么能这样做?
答案 0 :(得分:3)
听起来,要清除措辞,你想获得元素类型为T的所有索引。这是Array的一个扩展,它会做到这一点,举个例子:
extension Array {
func indices<T>(ofType type: T.Type) -> [Int] {
return self.enumerated().filter({ $0.element is T }).map({ $0.offset })
}
}
struct TypeA { }
struct TypeB { }
let list: [Any] = [TypeA(), TypeB(), TypeB(), TypeA()]
print(list.indices(ofType: TypeA.self)) // prints [0, 3]
答案 1 :(得分:2)
您可以直接过滤indices
,这是更通用的版本(归功于Leo Dabus
和Hamish
)
extension Collection {
func indices<T>(of type: T.Type) -> [Index] {
return indices.filter { self[$0] is T }
}
}
答案 2 :(得分:1)
这可能适合你:
extension Array {
func indices<T>(of: T.Type) -> [Int] {
return self.enumerated().flatMap { $0.element is T ? $0.offset : nil }
}
}
或者如果您想要处理更传统的解决方案,那么这就是您的方式:
extension Array {
func indices<T>(of: T.Type) -> [Int] {
var indices = [Int]()
for (n, item) in self.enumerated() {
if item is T {
indices.append(n)
}
}
return indices
}
}
与此测试数组一样:
let array: [Any] = [1, 2, "3", "4"]
debugPrint(array.indices(of: String.self))
两者都在Playground中显示相同的输出,即:
[2, 3]