什么时候从 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。
要回答你问题的标题,那么,假设可以为 struct
s 做这个:
- A
class
可能比 struct
有用,如果你有一个多层次的继承层次结构,使用协议一致性表达可能更复杂
当您需要引用语义时,- A
class
可能比 struct
有用——请参阅:
在您的具体情况下,这些中的任何一个都不会立即出现,但有了更多信息,切换是否有益可能会变得显而易见。
我想了好几个小时: 假设您有一款通用游戏。游戏可以有玩家和设置分数的方法。这可以通过使用协议来完成:
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。
要回答你问题的标题,那么,假设可以为 struct
s 做这个:
- A
class
可能比struct
有用,如果你有一个多层次的继承层次结构,使用协议一致性表达可能更复杂
当您需要引用语义时, - A
class
可能比struct
有用——请参阅:
在您的具体情况下,这些中的任何一个都不会立即出现,但有了更多信息,切换是否有益可能会变得显而易见。