在对NSURLSession Swift进行子类化时,Initializer不会覆盖指定的初始值设定项

时间:2015-10-05 13:47:07

标签: swift nsurlsession subclassing nsurlsessionconfiguration

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

2 个答案:

答案 0 :(得分:3)

你不能。

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

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

class NSURLAuthSession {
    private let urlSession: NSURLSession

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

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

答案 1 :(得分:1)

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