在继承 NSURLSession Swift 子类时,初始化器不会覆盖指定的初始化器

Ale*_*xey 2 subclassing nsurlsession nsurlsessionconfiguration swift

我想对 NSURLSession 类进行子类化,但我在初始化时遇到问题。基本上我重写构造函数并在那里初始化常量,authUrl然后调用父 init 方法。

class NSURLAuthSession: NSURLSession {
    let authUrl:NSURL;

    //Error: Initializer does not override a designated initializer from its superclass
    override init(configuration: NSURLSessionConfiguration, delegate: NSURLSessionDelegate?, delegateQueue queue: NSOperationQueue?){
        self.authUrl = NSURL.URLWithBaseURLString("http://192.168.10.105:8888/api/v1", pathSegments: ["users", "login"])!
        super.init(configuration: configuration, delegate: delegate, delegateQueue: queue)
    }
}
Run Code Online (Sandbox Code Playgroud)

从 NSURLSession 的源代码中我发现它有两个初始化器:

public /*not inherited*/ init(configuration: NSURLSessionConfiguration)
public /*not inherited*/ init(configuration: NSURLSessionConfiguration, delegate: NSURLSessionDelegate?, delegateQueue queue: NSOperationQueue?)
Run Code Online (Sandbox Code Playgroud)

我期望“最长”的初始化程序是指定的初始化程序,但事实并非如此。我怀疑指定的初始值设定项init()甚至没有在源代码中指定。如何覆盖初始化程序并设置配置NSURLSessionConfiguration

mix*_*xel 6

你不能。

唯一指定的初始值设定项是NSURLSession.init(),您必须从子类初始值设定项中调用它。NSURLSession configurationdelegate并且delegateQueue属性是只读的,因此您无法手动设置它们。

更好的方法是用NSURLSession自定义类包装:

class NSURLAuthSession {
    private let urlSession: NSURLSession

    init(urlSession: NSURLSession) {
        self.urlSession = urlSession
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,您将拥有更多的控制和定制选项。