2016-06-24 3 views
1

私は車のクラスがあります。車がジャンクヤードに行くと、この車はもはや人口全体ではカウントされないはずです。私はデイニット機能を持っていますが、車の人口から車を体系的に取り除くにはどうすればいいですか?言い換えれば、デイナイトをどのようにして有効にするのですか?デイナイトをスウィフトで効果を発揮する方法

私はクラス変数isJunkを持っていますが、それを使ってこの作業を行う方法はわかりません。

class Car { 
    static var population: Int = 0 
    var isJunk: Bool = false 
    var color: String 
    var capacity: Int 
    var driver: Bool? 
    var carOn: Bool = false 
    init (carColor: String, carCapacity: Int) { 
     self.capacity = carCapacity 
     self.color = carColor 
     Car.population += 1 

    } 
    deinit { 
     Car.population -= 1 
    } 

    func startCar() { 
     self.carOn = true 
    } 
} 
+1

Isjunkは何もしません。オブジェクトの初期化が解除されると、そのポインタは失われ、使用できなくなります。オブジェクトをガベージコレクションに送る最も簡単な方法は、そのオブジェクトへのすべての参照をnilに設定することだけです。自動参照カウントは残りを行います。 –

+1

@Philip Feldmann:Xcodeには**ガベージコレクション**はありません。ちょうどARC –

+0

あなたは正しいですが、ただのARCだけですが、すべての参照がnilの場合、ARCはオブジェクトを破棄し、deinitが呼び出されます。それが呼び出されていない場合は、漏れがあります。 – Feldur

答えて

5
class Car { 
    static var population: Int = 0 
    init() { 
     Car.population += 1 

    } 
    deinit { 
     Car.population -= 1 
    } 
} 

var cars: [Car] = [Car(), Car()] 
print("Population:", Car.population) // "Population: 2" 

// now the second car is removed from array and we have no other references to it 
// it gets removed from memory and deinit is called 
cars.removeLast() 
print("Population:", Car.population) // "Population: 1" 

しかし、同じことがcars配列内のアイテムの数を求めることによってだけ達成することができます。それは通常、インスタンスのプライベートカウンタよりも優れた選択肢です。

アイテムをメモリに保持するには、アイテムには常に何らかの種類のレジスタ(配列など)が必要です。そしてその登録簿はそれらを数え続けることができます。

一つの可能​​性:

class CarPopulation { 
    var liveCars: [Car] = [] 
    var junkCars: [Car] = [] 
} 

それとも、1つの配列にそれらを維持し、車上junkを設定し、必要なときに非ジャンク車を数えることができます。

class CarPopulation { 
    var cars: [Car] = [] 

    func liveCars() -> Int { 
     return self.cars.filter { !$0.junk }.count 
    } 
} 

そこに多くの可能性があるが、抽出車を所有する他のクラスへのカウンターは、おそらくより良い解決策です。

+0

私は理解しています!配列の代わりに 'var car = Car()'と 'var car2 = Car()'であるかどうかについてのいくつかの洞察を提供できますか?どのように2番目の参照を削除しますか? –

+0

car2の背後にあるオブジェクトへの唯一の参照であれば、 'car2 = nil'を実行して参照を削除することができます。 –

+0

ただし、 'deinit'をすぐに呼び出す必要はありません。 – Sulthan

1

のインスタンスを割り当て解除すると(オブジェクトのインスタンスを完全に取り除いたとき)、deinitが呼び出されます。あなたがCarインスタンスをジャンクヤードに置くと、Carのインスタンスを取り除きたいとは思わないが、実際にはその場所を変更したいだけです。私はCarの場所を変更するのを処理する別の関数を提案します。おそらく、

func changeLocation(newLocation: String) { 
    // Perhaps add an instance variable to 'remember' the location of the car 
    switch newLocation { 
    case "junkyard": 
    Car.population -= 1 
    default: 
     // Perhaps check whether previous location was Junkyard and increment 
     // counter if the Car is coming out of the Junkyard 
     print("Unrecognized location") 
    } 

} 
関連する問題