簡體   English   中英

超類方法在swift中返回子類類型

[英]superclass methods to return subclass type in 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類。

我希望有人可以幫助我。 我真的沒有想法。 謝謝! 我想避免鏈接,我認為這是最后的手段。

事實證明我能夠做一些工作; 感謝這個問題的答案:轉換為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

按預期工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM