Swift:帮助我了解创建和使用从基类派生的专业类的 Swift 方式

标签 swift oop

来自 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/

相关文章:

ios - 无法获取用于在 iOS 中使用 GCM 实现推送通知的配置文件

OOP 中的 Python MQTT 回调

java - java中OOP概念和设计模式的区别(哪个更重要)

javascript - 如何在javascript中应用虚函数

ios - Swift 中带有 print 或 println 的混合文本的文本方向

ios - 如何在应用程序委托(delegate)中调用时使 View Controller 动画化

ios - 以编程方式约束

swift - 从 NSNotification Assets 中提取视频 URL

java - 用于工厂模式的全局函数或没有名称 java 的函数

c# - 我应该把 Actor 放在领域模型/类图中吗?