Методы создания подклассов URLSession в Swift
Я пытаюсь создать подкласс URLSession
в Swift (причина не имеет значения, но имеет отношение к тестированию). Мне это нужно для работы с 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 для автоматического наследования инициализатора:
If your subclass doesn’t define any designated initializers, it
automatically inherits all of its superclass designated initializers.
Итак, технически MyURLSession
должен наследовать все обозначенные инициализаторы, но это не так, и он наследует только init()
от NSObject
, Просмотр документации URLSession
:
public /*not inherited*/ init(configuration: URLSessionConfiguration)
public /*not inherited*/ init(configuration: URLSessionConfiguration, delegate: URLSessionDelegate?, delegateQueue queue: OperationQueue?)
Помимо комментария ничего не видно, что он не унаследован. Рассматривая определения Objective-C, мы можем заметить, что они не инициализаторы, а скорее фабричные методы, которые импортируются в Swift как inits.
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;
Итак, вопрос в том, как переопределить и / или правильно вызвать эти методы суперкласса при инициализации?
1 ответ
Вы не должны создавать подклассы URLSession. У вас нет доступа к методам инициализатора, к которым вы хотите получить доступ, а свойства URLSessionConfiguration и делегата доступны только для чтения, поэтому у вас не будет возможности их установить.
По сути, нет способа делать то, что вы хотите с помощью подклассов.
Если вы заинтересованы в тестировании URLSessions, то, возможно, взгляните на что-то вроде этого Mock Objects For Testing