我想继承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
?
答案 0 :(得分:3)
你不能。
唯一指定的初始化程序是NSURLSession.init()
,您必须从子类初始值设定项中调用它。 NSURLSession
configuration
,delegate
和delegateQueue
属性为只读属性,因此您无法手动设置它们。
更好的方法是使用自定义类包装NSURLSession
:
class NSURLAuthSession {
private let urlSession: NSURLSession
init(urlSession: NSURLSession) {
self.urlSession = urlSession
}
}
因此您将拥有更多控制和自定义选项。
答案 1 :(得分:1)
仅暴露“虚拟”初始化程序的原因是UIKit的开发人员不希望您继承NSURLSession。如果您只想提供自己的URL,请在NSURLSession上编写便捷方法,或者使用现有API自行配置。