2017-02-01 2 views
1

특정 유형의 개체를 신속하게 가져 오는 가장 좋은 방법은 무엇입니까? 예컨대 여기신속한 형식 프로토콜 배열

protocol Fruit { 
    func setColor() 

} 

class Orange:NSObject, Fruit { 
    func setColor() { 

    } 
} 

class Apple:NSObject, Fruit { 
    func setColor() { 
    } 
} 


class MyClass { 

    var fruits:[Fruit]? // get from data base 

    //here how to get fruits only of type Orange. i.e. Array of oranges 

} 

한 가지 방법은 내가 새로운 배열에 추가 할 수 있습니다 다음 루프 "에 대한"넣어 각 개체의 유형을 확인 할 수 있습니다.

하지만 할 수있는 다른 방법이 있습니까?

편집 :

아래 작품. 다른 방법이 있습니까? 향후 사용을 위해 저장 (정지 유형 [Fruit]의) 필터링 된 배열을 원하는 경우

for fruit in fruits where fruit is Orange { 

} 

:

var oranges: [Orange] = [] 
    for orange in fruits { 

    if let myOrange = orange as? Orange { 
     oranges.append(myOrange) 
    } 
    } 
+1

Swift에서 세터와 getter를 작성하는 것은 좋지 않습니다. 그냥 공공 재산을 사용하십시오. 그게 그들이 그곳에있는 이유입니다. – Alexander

+1

또한 NSCoding을 따르지 않으려면 NSObject를 서브 클래스 할 필요가 없습니다. 그렇지 않으면 클래스 대신 struct를 사용해야합니다. –

+1

루프의 이름이 잘못 지정되면 '과일의 과일'에 더 좋을 것입니다. 오렌지 {' –

답변

2

당신은 단순히 for 루프에서 이러한 반복하려면, 단지 where 절을 추가 , filter 사용 : 향후 사용을 위해 저장 (유형 [Orange]의)는 filtere 배열을 원하는 경우

let oranges = fruits.filter{ $0 is Orange } 

, 사용자 flatMap :

let oranges = fruits.flatMap{ $0 as? Orange } 
+0

필터 옵션에 오류가 발생했습니다. '[과일]'유형의 값을 예상되는 인수 유형 '[오렌지]'로 변환 할 수 없습니다. –

+0

@ user364765 과일을 풀 었습니까? – Alexander

+1

'let oranges = fruits.flatMap {$ 0 as? 오렌지}' – vacawama