【问题标题】:Swift: Reset an instanceSwift:重置实例
【发布时间】:2023-12-24 19:00:01
【问题描述】:

我想知道快速重置对象属性的最佳实践方法是什么。在下面的示例代码中,我正在寻找一种方法来重置对象的属性而不创建新对象。

我知道最好创建一个新对象,因为它具有相同的效果,但我想知道是否有一种方法可以在不创建新对象的情况下做到这一点。另外,我知道我可以一个一个地重置每个属性,但是在一个有很多属性的类中,这将是一种更简洁的方法。

示例代码:


var pingPong: Game = Game()

class Game {

    var player1Score: Int
    var player2Score: Int

    init() {
        self.player1Score = 0
        self.player1Score = 0
    }

    func newGame() {
        init() //Code in question
    }

}

我尝试从newGame() 方法调用init() 类,这会引发错误。我也试过调用self.init(),之后我收到一个错误,告诉我改用type(of: self).init(),这又引发了另一个错误Constructing an object of class type 'pingPong' with a metatype value must use a 'required' initializer

如何在不创建新对象的情况下完成重置对象的属性?

【问题讨论】:

    标签: swift class init


    【解决方案1】:

    没有一个神奇的功能可以重置所有属性。

    第一个选项是手动重置所有属性:

    class Game {
    
        var player1Score: Int = 0
        var player2Score: Int = 0
    
        init() {
            
        }
        
        func reset() {
            player1Score = 0
            player2Score = 0
        }
    
        func newGame() {
            reset()
            //continue other newGame functions
        }
    
    }
    

    但是,如果您有很多属性,这可能会变得乏味。相反,您可以将您的状态封装成一个值类型 (struct),并在您准备好进行新游戏时创建一个新实例。可能看起来像这样:

    struct GameState {
        var player1Score = 0
        var player2Score = 0
    }
    
    class Game {
    
        var gameState : GameState
    
        init() {
            self.gameState = GameState()
        }
    
        func newGame() {
            self.gameState = GameState()
            //continue other newGame functions
        }
    
    }
    

    这样,您的 Game 实例保持不变,但它拥有的状态被重置。

    【讨论】:

      最近更新 更多