如何让deinit在swift中生效

时间:2016-06-24 21:20:03

标签: swift initialization deinit

我有一个汽车课。让我们说一辆车去垃圾场,这辆车应该不再算在总人口中了。我有deinit功能,但我如何系统地从汽车人口中删除汽车?换句话说,我如何让deinit生效?

我有一个类变量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 } } ,但不知道如何使用它来完成这项工作。

$(".accordion-content-container").hide();

$('.accordion-trigger').click(function() {
   //Expand or collapse this panel
   $(this).next().slideToggle('fast');
   $(this).find('span').toggleClass('fa-minus');

   //Hide the other panels
   $(".accordion-content-container").not($(this).next()).slideUp('fast');

   // remove classes 'fa-minus' unless its part of the accordion being triggered
    $('span').removeClass('fa-minus');
   $(this).find('span').addClass('fa-minus');
});

2 个答案:

答案 0 :(得分: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数组中的项目数即可实现同样的效果。而且这通常是一个更好的替代方案,而不是私人的实例反击。

要将项目保留在内存中,您将始终需要某种寄存器(例如数组)。那个登记册可以让他们计算在内。

一种可能性:

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

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

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

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

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

答案 1 :(得分:1)

当您释放http://web.docker的实例时(当您完全摆脱对象的实例时),将调用deinit。当你在垃圾场放置一个Car实例时,我认为你不想摆脱Car的实例,你真的只想改变它的位置。我建议使用不同的函数来处理Car的位置。

也许:

Car