【问题标题】:Swift self in static method静态方法中的 Swift self
【发布时间】:2015-10-27 15:12:55
【问题描述】:

我想在静态方法中使用 self 作为类类型,但出现编译时错误。

这是我的测试代码:

protocol JSONMappable {
    static func map(JSON: AnyObject!) -> Self
}

class Model : JSONMappable, Mappable {   
    required init?(_ map: Map){

    }

    func mapping(map: Map) {

    }

    static func map(JSON: AnyObject!) -> Self {
        return Mapper<self>().map(JSON)
    }   
}

所以在静态方法映射中我想使用 self 作为类类型,我也尝试了 self.Type,但我得到了同样的错误。我不想使用类名,因为当在subclass 上调用它时,我需要这个方法使用subclass 类名。例如,如果我有:

class SubClass : Model {

}

然后调用:

SubClass.map(JSON)

我需要在此方法中使用SubClass 而不是Model。 所以我想知道这是否可能?

【问题讨论】:

  • 为什么要返回self?
  • @Lukas 这里的尝试是返回该类型的实例

标签: swift


【解决方案1】:
protocol A {
    static func f()->Self
}
// class should conform to protocol A, so the returned type should be B
final class B: A {
    static func f() -> B {
        return B()
    }
}

let b = B()
let c = B.f()

我没有看到任何实际用法,因为 final 类不能被子类化并且为了实现你的协议,该类应该被声明为 final

顺便说一句,这个意思是一样的

protocol A {
    static func f()->Self
}

final class B: A {
    class func f() -> B {
        return B()
    }
}

没有静态

protocol A {
    func f()->Self
}

class B: A {
    func f()->Self {
        return self
    }
}
let a = B()
let b = a.f()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 2013-01-29
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多