我有这个代码:
class Dark: NSObject {
class var className: String {
return NSStringFromClass(self)!.componentsSeparatedByString(".").last!
}
var success = 0
class func devour<T: Dark>(params: Int) -> T {
var s = T()
return assign(s, params: params)
}
class func assign<T: Dark>(item: T, params: Int) -> T{
if item.dynamicType === self {
item.success = params
}
return item
}
}
class Black: Dark {
}
class Violet: Dark {
}
Black.className // returns "Black"
Violet.className // returns "Violet"
当我这样做时出现问题:
var ret = Black.devour(5)
ret.success //returns 0 which I expect to be 5
ret.self // returns {Dark success 0} which I expect to be {Black success 0}
这里的问题是当子类使用继承的方法devour时,返回的是Dark
类型的对象。我希望在调用 devour 时能够返回子类类型而不是父类(super class)类型。我这样做的例子:
var ret = Black.devour(5)
ret 的类应该属于 Black
而不是 Dark
。
我希望有人能帮助我解决这个问题。我真的没主意了。谢谢! 我想避免链接,我认为这是最后的手段。
最佳答案
事实证明我可以解决这个问题;感谢这个问题的回答:Cast to typeof(self) .
我需要做的就是创建一个返回 Self 类型对象的方法。
首先,我创建了一个类,该类创建基类的实例并将其作为 AnyObject 的实例返回。
class func createDark() -> AnyObject {
var black = Black()
return black
}
当我返回 Black
的实例时,它会自动将其转换为 AnyObject,因为它是该方法的指定返回类型(老实说,我刚刚弄明白了这一点,这救了我)。
然后我创建了一个调用 createDark()
并将属性/特性分配给实例的辅助方法:
class func prepare<T: Dark>(params: Int) -> T{
var dark = createDark() as T
dark.assign(params)
return dark
}
我使用了 Dark
类型或其子类的泛型类型作为返回类型。
然后我这样做了:
class func devour(params: Int) -> Self {
return prepare(params)
}
通过将 Self
指定为返回类型,它会自动将其转换为 self 类型,可以是 Dark
类型或任何继承它的类。
我的最终代码如下所示:
class Dark: NSObject {
var success = 0
func assign(params: Int) {
if self.dynamicType === self { // I dont really have to do this anymore
self.success = params
}
}
class var className: String {
return NSStringFromClass(self)!.componentsSeparatedByString(".").last!
}
class func createDark() -> AnyObject {
var black = Black()
return black
}
class func prepare<T: Dark>(params: Int) -> T {
var dark = createDark() as T
dark.assign(params)
return dark
}
class func devour(params: Int) -> Self {
return prepare(params)
}
}
检查它是否解决了问题:
var ret = Black.devour(5)
ret.success //now returns 5 as expected
ret.self // now returns {Black success 0} as expected
按预期工作!
关于ios - 父类(super class)方法在swift中返回子类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28874464/