Swift返回数组元素的索引

时间:2017-11-22 16:16:25

标签: arrays swift

我想编写遍历数组的函数,并返回找到该元素的索引。

类似的东西:

StimLabel

然而,我没有成功。我怎么能这样做?

3 个答案:

答案 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 DabusHamish

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]