我想了好幾個小時:假設你有一個通用游戲。游戲可以有玩家和設定分數的方法。這可以通過使用協議來完成:
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 撰寫所有代碼。(可能有更多功能保持不變)。
現在的問題是:我應該切換到一個類,撰寫一個基類并從它繼承,還是有辦法為協議中的函式提供某種默認實作,所以我不需要每次都重新撰寫它們,確認協議時?
uj5u.com熱心網友回復:
有沒有辦法為協議中的函式提供某種默認實作,所以在確認協議時我不需要每次都再次撰寫它們?
確實有一種方法可以為符合協議的型別提供默認方法實作:
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 類中的方法),或者使用默認實作而不做任何額外的作業。
有關更多資訊,您可以查看Swift 編程語言指南的協議中的“提供默認實作”部分。
那么,要回答您的問題的標題,假設可以為structs 執行此操作:
- 如果您有多個層次的繼承層次結構, A
class可能比 a 有用,struct使用協議一致性表示可能更復雜 - 當您需要參考語意時,
A
class可能比 a 有用- 請參閱:struct- 結構和列舉是值型別和
- 類是參考型別
在您的具體情況下,這兩種方法都不會立即適用,但有了更多資訊,切換是否有益可能會變得很明顯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/421194.html
標籤:
