2017-11-22 1 views
0

배열을 살펴보고 해당 요소가있는 인덱스를 반환하는 함수를 작성하고 싶습니다. 같은배열 요소의 신속한 반환 인덱스

뭔가 :

extension Array { 

    func elementIndexes<T>() -> [Int] { 

     // if element is kind of class "T" add it to array [T] and then return 

    } 
} 

그러나, 내가 성공하지. 누군가가 저를 도울 수 있습니까?

extension Array { 

    func indices<T>(of: T.Type) -> [Int] { 

     return self.enumerated().flatMap { $0.element is T ? $0.offset : nil } 

    } 

} 

또는 당신이 더 많은 기존 솔루션을 처리하려는 경우 다음이 당신의 방법입니다 :

+1

그래서 T 타입의 원소 만 가져 오는 배열을 필터링하고 싶습니까? – Connor

+1

인덱스를 되찾고 싶다면 왜 리턴 값이 [T]입니까? – holex

+0

@ 홀렉스 미안하지만 잘못 입력했는데 편집했습니다. 물론 인덱스를 원합니다. –

답변

3

, 당신은 모든 인덱스를 얻을 것인지, 문구를 취소합니다 , 예와 함께 :

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] 
+0

대단히 감사합니다! –

+1

그것은 전혀 작동하지 않는다는 것이 수치 스럽습니다. (주석 대신에 – holex

+0

@ 홀 렉스, 내 1 오타를 지적했을 수 있습니다. – Connor

1

이 당신을 위해 작동 할 수 있습니다이 테스트 배열과 같은

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)) 

이다 놀이터에서 동일한 출력 : 요소가 있다고 할 것이다 배열에 확장 타입 T. 여기입니다 어디 그것은 소리

[2, 3] 
+0

대단히 감사합니다! –

2

당신은이 더 일반적인 버전 (Leo Dabus 학점 및 Hamish)

extension Collection { 

    func indices<T>(of type: T.Type) -> [Index] { 
     return indices.filter { self[$0] is T } 
    } 
} 
입니다 직접 indices를 필터링 할 수 있습니다
+0

대단히 고마워요! –

+0

'indices.lazy.filter' –