Инициализатор не переопределяет указанный инициализатор при создании подкласса NSURLSession Swift

Я хочу создать подкласс класса 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 ответа

Решение

Ты не можешь.

Единственный назначенный инициализатор NSURLSession.init() и вы должны вызвать его из инициализатора вашего подкласса. NSURLSessionconfiguration, delegate а также delegateQueue свойства доступны только для чтения, поэтому вы не можете установить их вручную.

Лучший способ - завернуть NSURLSession с пользовательским классом:

class NSURLAuthSession {
    private let urlSession: NSURLSession

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

Таким образом, у вас будет больше возможностей для управления и настройки.

Причина, по которой раскрывается только "фиктивный" инициализатор, заключается в том, что разработчики UIKit не хотят, чтобы вы делали подкласс NSURLSession. Если вы просто хотите указать свой собственный URL, напишите удобный метод в NSURLSession или просто настройте его самостоятельно, используя существующий API.

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