我试图在Swift中创建 URLSession
的子类(原因无关紧要,但与测试有关) . 我需要它使用 delegate
和特定的 URLSessionConfiguration
,这是 URLSession
上的只读属性 . 使用委托初始化 URLSession
的常用方法是使用下面的代码完成的,它可以完美地运行:
let session = URLSession(configuration: URLSessionConfiguration.default, delegate: nil, delegateQueue: nil)
现在让我们创建一个子类:
class MyURLSession : URLSession {}
let session = MyURLSession(configuration:
URLSessionConfiguration.default, delegate: nil, delegateQueue: nil) // Compile error
初始化程序触发下一个编译错误:
error: argument passed to call that takes no arguments
根据Swift Language Guide规则1为 Automatic Initializer Inheritance :
If your subclass doesn’t define any designated initializers, it
automatically inherits all of its superclass designated initializers.
因此,技术上 MyURLSession
应该继承所有指定的初始值设定项,但它不会,并且它只从 NSObject
继承 init()
. 查看 URLSession
的文档:
public /*not inherited*/ init(configuration: URLSessionConfiguration)
public /*not inherited*/ init(configuration: URLSessionConfiguration, delegate: URLSessionDelegate?, delegateQueue queue: OperationQueue?)
除了评论之外没有任何其他内容可见,它是 not inherited . 查看它的Objective-C定义,我们可以注意到它们不是初始化器,而是工厂方法,它们作为inits导入到Swift中 .
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;
So the question is, how to override and/or correctly call these methods of superclass in initialization?
1 回答
你不应该继承URLSession . 您无法访问要访问的初始化方法,并且URLSessionConfiguration和委托属性是只读的,因此您无法设置它们 .
基本上没有办法通过子类化做你想做的事 .
如果你关心测试URLSessions,那么也许看看像这样的东西Mock Objects For Testing