gpt4 book ai didi

swift - 如何让deinit在swift中生效

转载 作者:可可西里 更新时间:2023-11-01 00:22:37 24 4
gpt4 key购买 nike

我有一个汽车类。假设一辆汽车开往垃圾场,这辆车不应再计入总人口。我有 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
}
}

最佳答案

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 数组中的项目数来实现。这通常是比私有(private)实例计数器更好的选择。

为了将项目保存在内存中,您总是需要为它们提供某种寄存器(例如数组)。该寄存器可以让它们计数。

一种可能:

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

或者你可以将它们放在一个数组中并在汽车上设置 junk 并在需要时计算非垃圾车:

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

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

有很多可能性,但将计数器提取到其他拥有汽车的类可能是更好的解决方案。

关于swift - 如何让deinit在swift中生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38022278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com