【发布时间】:2019-02-14 02:47:39
【问题描述】:
我希望在使用我的静态方法时得到一个特定的实例。例如:
class Food: NSObject {
var name: String
class func initFruit() -> Food? {
let fruitName = NSStringFromClass(self).components(separatedBy: ".").last! as String
if "Apple" == fruitName {
return Apple(name: fruitName)
} else if "Orange" == fruitName {
return Orange(name: fruitName)
}
return nil
}
init(name: String) {
self.name = name
}
}
class Apple: Food {
}
class Orange: Food {
}
当我使用以下方法创建Apple 实例时:
let apple = Apple.initFruit() as? Apple
我怎样才能得到特定的实例苹果而不是使用as? Apple?。我想知道如何修改方法:
static func initFruit() -> Food?
【问题讨论】:
-
这可以很容易地使用协议和泛型而不是继承来实现。此外,Apple 的 Swift 指南已转向面向协议,而 imo 这就是你应该这样做的方式。
-
我同意@Eddie,但是,我想提供一些建议。泛型或继承的全部意义在于您不必知道类型,即
Apple或Orange。因此,当您初始化时,您可能拥有if(Apple){}, else if(Orange){}...,但之后您可以只使用Food.isEaten或Food.jumpIntoCrockPot(),而不必拥有Apple.jumpIntoCrockPot()和Orange.jumpIntoCrockPot()。因此,您要创建Food.init() as? Apple的静态实例的概念删除了Food.init()的点,因为您现在已将其类型转换为Apple。 -
这只是一个例子。我想知道它是否会从超类静态方法中获取特定的实例。
-
我不认为你可以使用
static,但如果你更改为class func并在你的子类中覆盖它们,那么你可以返回确切的类。超类不应该知道子类,所以你不能这样做。首选使用工厂类型或泛型类型 -
你为什么要打电话给
initFruit?为什么不直接实例化Apple?静态方法几乎没有提供额外的功能。
标签: ios swift inheritance