3

私は車のクラスを持っています。車が廃品置き場に行くとしましょう。この車はもはや総人口には数えられません。私は deinit 関数を持っていますが、車の母集団から車を体系的に削除するにはどうすればよいですか? つまり、deinit を有効にするにはどうすればよいでしょうか。

クラス変数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
    }
}
4

2 に答える 2

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ただし、配列内のアイテムの数を尋ねるだけで同じことが実現できます。これは通常、インスタンスのプライベート カウンターよりも優れた代替手段です。

アイテムをメモリに保持するには、常にある種のレジスタ (配列など) が必要です。そして、そのレジスターはそれらをカウントし続けることができます。

1 つの可能性:

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

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

于 2016-06-24T21:28:38.107 に答える
1

deinitインスタンスの割り当てを解除するCarとき (オブジェクトのインスタンスを完全に削除するとき) に呼び出されます。インスタンスを廃品置き場に置くとき、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")
   }

}
于 2016-06-24T21:33:42.840 に答える