什么时候从 struct 切换到 class in swift?

When to switch from struct to class in swift?

我想了好几个小时: 假设您有一款通用游戏。游戏可以有玩家和设置分数的方法。这可以通过使用协议来完成:

protocol Game {
    var players: [Player] {get set}
    func setScore (for player: Player, value: Int)
    func sendSomeMessage(message: String)

}

我现在可以创建一个结构来确认协议“游戏”

struct raiseGame: Game {
    var players: [Player]()
    func setScore (for player: Player, value: Int) {
        player.score += value
    }
    func sendSomeMessage(message: String) {
       players.forEach { player in
            //send the message to each player
       }
    }
}

但是我有另一个符合 Game 的结构。但是此时应该降低分数。所有其他事情保持不变。现在我必须再次为 func sendSomeMessage 编写所有代码。 (可能会有更多的功能保持不变)。

现在的问题是:我应该切换到 class,编写一个基础 class 并继承它,还是有办法为协议中的函数提供某种默认实现,所以我不需要每次都写它们,确认协议时?

is there a way to provide somekind of default implementations for functions in protocols, so i don't need to write them every time again, when confirming to a protocol?

确实有一种方法可以为 protocol-conforming 类型提供默认方法实现:

protocol MyProtocol {
    func myMethodRequirement()
}

extension MyProtocol {
    func myMethodRequirement() {
        // Default implementation.
    }
}

struct Foo: MyProtocol {
    func myMethodRequirement() {
        // Foo-specific implementation.
    }
}

struct Bar: MyProtocol {
    /* Inherits default implementation instead. */
}

在您的情况下,给 sendSomeMessage(message:) 一个默认实现如下:

extension Game {
    func sendSomeMessage(message: String) {
        // Default implementation here.
    }
}

任何符合 Game 的类型都可以实现 sendSomeMessage(message:) 本身(类似于 override-ing class 中的方法),或者使用默认实现而无需做任何额外的工作。

有关详细信息,您可以参阅 Swift 编程语言指南的 "Providing Default Implementations" section on protocols


要回答你问题的标题,那么,假设可以为 structs 做这个:

在您的具体情况下,这些中的任何一个都不会立即出现,但有了更多信息,切换是否有益可能会变得显而易见。