Методы создания подклассов 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

Другие вопросы по тегам