1

我想继承 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)
    }
}

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

public /*not inherited*/ init(configuration: NSURLSessionConfiguration)
public /*not inherited*/ init(configuration: NSURLSessionConfiguration, delegate: NSURLSessionDelegate?, delegateQueue queue: NSOperationQueue?)

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

4

2 回答 2

4

你不能。

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

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

class NSURLAuthSession {
    private let urlSession: NSURLSession

    init(urlSession: NSURLSession) {
        self.urlSession = urlSession
    }
}

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

于 2015-10-05T14:06:14.743 回答
1

仅暴露“虚拟”初始化程序背后的原因是 UIKit 的开发人员不希望您继承 NSURLSession。如果您只想提供自己的 URL,请在 NSURLSession 上编写一个方便的方法,或者使用现有的 API 自己配置它。

于 2015-10-05T14:46:26.407 回答