2017-02-01 7 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 

} 

一つの方法は、私は新しい配列に追加することができ、その後のループ「のために」入れて、各オブジェクトの種類を確認することができます。

しかし、他にもすてきな方法がありますか?

EDIT:私にとっては作品の下

。他の方法がありますか?あなたは将来の使用のために格納する(まだタイプ[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でセッターとゲッタを書くのは悪い習慣です。公共の物件を使うだけです。それが彼らのためにあります。 – Alexander

+1

NSObjectをNSCodingに準拠させることを計画している場合を除き、NSObjectをサブクラス化する必要はありません。それ以外の場合は、クラスの代わりに構造体を使用する必要があります。 –

+1

ループの命名が悪いと、 'fruit in fruits'の方がはるかに良くなり、' orange orange = fruit 'とすれば?オレンジ{' –

答えて

2

あなたは、単にforループ内でこれらを反復処理したい場合は、単にwhere句を追加、filterを使用します。

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

あなたは(タイプ[Orange]の)filtere配列は、将来の使用のために保存したい場合は、利用者flatMap

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

フィルタオプションのエラーが発生しました - '[Fruit]'タイプの値を '[Orange]'の予想される引数タイプに変換できません –

+0

@ user364765フルーツを開封しましたか? – Alexander

+1

'let oranges = fruits.flatMap {$ 0 as?オレンジ} ' – vacawama

関連する問題