微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 在swift中返回子类类型的超类方法

我有这个代码
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

按预期工作!

原文地址:https://www.jb51.cc/iOS/333565.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐