如何让deinit在swift中生效

Gov*_*Rai 2 initialization swift 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
    }
}
Run Code Online (Sandbox Code Playgroud)

Sul*_*han 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"
Run Code Online (Sandbox Code Playgroud)

但是,只需询问cars数组中的项数即可实现同样的效果.而这通常是一个比私人计数器更好的替代方案.

要将项目保存在内存中,您将始终需要某种寄存器(例如数组).并且该寄存器可以使它们保持计数.

一种可能性:

class CarPopulation {
    var liveCars: [Car] = []
    var junkCars: [Car] = []
}
Run Code Online (Sandbox Code Playgroud)

或者您可以将它们保存在一个阵列中并junk放在车上并在需要时计算非垃圾车:

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

    func liveCars() -> Int {
        return self.cars.filter { !$0.junk }.count
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @GovindRai很快,您不能将非可选的变量设置为nil,因此您的变量必须是可选的。初始化对象时,操作系统将在内存中为该对象腾出空间。您可以有多个指向同一对象(内存地址)的指针,例如`car3 = car2`将不会创建car2的副本,而只会创建一个新的引用。您必须删除对象的每个引用,才能使GC调用其deinit方法。但是,就像Sulthan已经提到的那样,让另一个类处理计数是一个更好的做法。 (2认同)