2017-02-10 6 views
2

私は動物スーパークラスと3つのサブクラスを持っている:ライオン犬と象。と同じ変数と値を持つサブクラスを呼び出す

enum Gender { 
    case male 
    case female 
} 

class Animal { 
    var species: String 
    var gender: Gender 

    init (species: String, gender: Gender) { 
     self.species = species 
     self.gender = gender 
    } 
} 

// Lion Class  
class Lion: Animal { 
    var age: Int = 10 

    init() { 
     super.init(species: "Lion", gender: Gender.male) 
    } 
} 

// Elephant Class 
class Elephant: Animal {  
    var age: Int = 8 

    init() { 
     super.init(species: "Elephant", gender: Gender.female) 
    } 
} 

//Dog Class 
class Dog: Animal { 
    var age: Int = 6 

    init() { 
     super.init(species: "Dog", gender: Gender.female) 
    } 
} 

これらのすべてには、スーパークラスのAnimalから継承されたgender変数があります。 今私はすべての男性の動物を含む[Animal]タイプのmaleAnimalの計算されたプロパティを持っています、それを行う最良の方法は何ですか?

class Zoo { 
    var animals: [Animal] = [Lion(), Elephant(), Dog()] 

    var maleAnimals: [Animal] { 
     for animalClasses in animals { 
      if animalClasses.gender == Gender.male { 
       return self.maleAnimals.append(animalClasses) 
      } 
     } 
    } 
} 

私は下の例のようなものを試しましたが、明らかに機能しません。

ご迷惑をおかけして申し訳ありません。

+0

フィルタは、あなたの必要条件に正確に合致しないものをフィルタリングします。 –

答えて

4

アレイ上でfilterメソッドを使用できます。

var maleAnimals : [Animal] { 
    return animals.filter { $0.gender == .male } 
} 
+0

まさに私が必要なもの!ありがとう – Ian

+0

あなたは大歓迎です:) – Yannick

3

あなたが見つけた最初の雄動物を返しています。 'animals'配列の 'filter'メソッドを使うべきです。

var maleAnimals: [Animal] { 
    return animals.filter { $0.gender == .male } 
} 
+0

私は遅いと思われます;)@ Yannick –

+0

からの答えを見て、まだ、ありがとうたくさん:) – Ian

2

他の回答が正しく、あなたが使用する必要がありますどのようにthatsの、ここでそれはことを願って、基本的にあなたがそれを返す、その後、それに値を割り当てる、クロージャ内で新しい変数を作成する必要があり、あなたのコードの修正ですが計算された値を使用する方法の詳細を少し分かります。

var maleAnimals : [Animal] { 
     var array = [Animal]() 
     for animalClasses in animals { 
      if animalClasses.gender == Gender.male { 
       array.append(animalClasses) 
      } 
     } 
     return array 
    } 
+0

それは多くの助けになります!!!!私のコードを修正してくれてありがとう:D – Ian

関連する問題