Как заставить deinit вступить в силу в быстрой

У меня есть класс автомобилей. Допустим, машина отправляется на свалку, эта машина больше не должна учитываться в общей численности населения. У меня есть функция 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
    }
}

2 ответа

Решение
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] = []
}

Или вы можете держать их в одном массиве и установить junk на машину и при необходимости подсчитывать неопасные автомобили:

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

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

Есть много возможностей, но, вероятно, лучшим решением будет выделение счетчиков для другого класса, которому принадлежат автомобили.

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

}
Другие вопросы по тегам