0

Я хочу подкласс класса NSURLSession, но у меня проблема с инициализацией. В основном я переопределяю конструктор и инициализирую константу authUrl, затем вызывая метод родительского init.Инициализатор не переопределяет назначенный инициализатор при подклассе NSURLSession Swift

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 
    } 
} 

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

+0

Спасибо за ответ, просто для уточнения, NSSession можно инициализировать конфигурацией и делегировать, но его подкласс NSURLAuthSession не может? – Alex

+0

Да, потому что подкласс должен назвать инициализатор, назначенный суперклассом. Вы можете прочитать больше о назначенных и удобных инициализаторах. Https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html – mixel

1

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

+0

Чтобы добавить метод удобства, мне нужно подклассифицировать NSURLSession (это не рекомендуется) правильно? – Alex

+1

Нет-нет-нет, просто позвоните в NSURLSession. Например: расширение NSURLSession {/ * мои удобные методы и прочее * /}. К сожалению, вы не сможете добавлять какие-либо сохраненные свойства в целевой класс. Надеюсь, теперь мой совет не двусмыслен. :) –

+1

Кроме того, на всякий случай (должно быть очевидно), я не ссылаюсь на удобное ключевое слово :) –

Смежные вопросы