在 Swift 中重写初始化器

Overriding Initializers in Swift

我正在开发一个应用程序,您可以在其中将图钉放在地图上并查看与该位置关联的 Flickr 图片。

该应用几乎可以正常运行,但我在某些 类 中遇到初始化程序问题。具体例子如下:

override init() {
    session = NSURLSession.sharedSession()
    super.init()
}

convenience init(delegate:HTTPClientProtocol) {
    self.init()
    self.delegate = delegate
}

有人可以帮我弄清楚这段代码有什么问题吗?在第一行,错误消息显示

Initializer does not override a designated initializer from its superclass

self.init() 的那一行,错误是

Value of type '->' has no member 'init'

如果您从 NSObject 继承,您的 override init 可以工作,因为您覆盖了 NSObject 的基本初始化程序:

protocol HTTPClientProtocol { }

class NSObj: NSObject {

    var session: NSURLSession!
    var delegate: HTTPClientProtocol?

    override init() {
        session = NSURLSession.sharedSession()
        super.init()
    }

    convenience init(delegate:HTTPClientProtocol) {
        self.init()
        self.delegate = delegate
    }
}

如果您的 class 是一个基础 class,它不继承任何其他 class,您的 override init 将无法工作,因为您没有要覆盖的 base class 初始值设定项。只需创建一个初始化程序和一个调用您刚刚创建的指定初始化程序的便利初始化程序:

protocol HTTPClientProtocol { }

class Obj {

    var session: NSURLSession!
    var delegate: HTTPClientProtocol?

    init() {
        session = NSURLSession.sharedSession()
    }

    convenience init(delegate:HTTPClientProtocol) {
        self.init()
        self.delegate = delegate
    }
}