我有这个代码:
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时返回子类类型而不是超类类型.我做的例子:
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
按预期工作!