ios - 父类(super class)方法在swift中返回子类类型

标签 ios iphone swift mobile

我有这个代码:

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/

相关文章:

ios - iOS 中 CGPointApplyAffineTransform 函数的公式

iphone - 如何在 swift 中验证 iOS 应用程序

iOS:是否可以将注释放在 map 的中心并在注释始终保持在中心的情况下移动 map ?

ios - 获取圆区域内的所有CGPoint

ios - Swift 3 - iOS 10 UITableView 启用 "swipe-to-delete"

ios - swift 中的自定义 Collection View 单元格

iOS UIWebView 不接受 URL 更改

ios - 移动到另一个导航 Controller 时,后退按钮变得无响应

ios - 禁用双击弹出 UITextView

ios - 从 uitableview 中的 uitextfield 获取值