来自 Ruby,我很难理解静态类型。
我有一个 Board
类,我希望使用 GameType
对其进行初始化。我想我应该从一个基类开始:
class GameType {
private(set) var targetNumber: Double = 10.0
private(set) var divisions: Double = 10
}
class TenGame: GameType {
override var targetNumber: Double { return 10.0 }
}
class HundredGame: GameType {
override var targetNumber: Double { return 100.0 }
}
但是,当然,子类具有不同的类型。这意味着,这不起作用:
let board = Board(withGameType: TenGame)
"Cannot convert value of type 'TenGame.Type' to expected argument type 'GameType'."
所以,生闷气之后,我想起了协议(protocol)。这很接近:
protocol GameType {
var targetNumber: Double { get }
var divisions: Double { get }
}
extension GameType{
var divisions: Double { return 10.0 }
var targetNumber: Double { return 10.0 }
}
class TenGame: GameType {}
但我仍然必须强制我的游戏类型:
let board = Board(withGameType: TenGame() as! GameType)
这可不太好!
我感觉我在这里遗漏了一些关键概念。这种模式在 Swift 中可能吗?我如何以 Swift 方式做到这一点?
最佳答案
问题是我没有注意错误消息:
"Cannot convert value of type 'TenGame.Type' to expected argument type 'GameType'."
在这里,我只传递类类型:
let board = Board(withGameType: TenGame)
我的 Board
类需要一个实例,因此我应该使用以下方式初始化它:
let board = Board(withGameType: TenGame())
关于Swift:帮助我了解创建和使用从基类派生的专业类的 Swift 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48644418/