swift - 在 Swift 中重写初始化器

标签 swift initialization overriding

我正在开发一个应用程序,您可以在其中将图钉放在 map 上并查看与该位置关联的 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
    }
}

如果您的类是不从任何其他类继承的基类,则您的重写 init 将不起作用,因为您没有要重写的基类初始值设定项。只需创建一个初始化程序和一个调用您刚刚创建的指定初始化程序的便利 init 即可:

protocol HTTPClientProtocol { }

class Obj {

    var session: NSURLSession!
    var delegate: HTTPClientProtocol?

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

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

关于swift - 在 Swift 中重写初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36092956/

相关文章:

ios - Swift 3 iOS 10 - 带有图像和文本的 UICollectionView 无法正确显示

java - 有人可以解释一下这个数组是怎么回事吗?

Java 以 C# 中的样式初始化类

C++ 创建一个类的实例

c# - "C# base class virtual function"- "override in Managed C++ ref class"

java - Jackson注释来覆盖父类中的注释

ios - 使用 unwind segue 传递数据

ios - 在 iOS 上使用 AVAudioPlayer 播放静音的最佳方式

arrays - 使用 Swift 反转数组中的字符串

c++ - 初始化 C++ 结构的正确方法