Как заставить 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")
}
}