1

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 のソース コードから、2 つの初期化子があることがわかりました。

public /*not inherited*/ init(configuration: NSURLSessionConfiguration)
public /*not inherited*/ init(configuration: NSURLSessionConfiguration, delegate: NSURLSessionDelegate?, delegateQueue queue: NSOperationQueue?)

「最長」の init が指定された初期化子であると予想していましたが、そうではありません。その指定されたイニシャライザはinit()、ソース コードでも指定されていないものだと思います。初期化子をオーバーライドして構成をセットアップするにはどうすればよいNSURLSessionConfigurationですか?

4

2 に答える 2

4

それはいけません。

指定されたイニシャライザは のみでNSURLSession.init()あり、サブクラスのイニシャライザから呼び出す必要があります。NSURLSession configurationdelegateおよびdelegateQueueプロパティは読み取り専用であるため、手動で設定することはできません。

NSURLSessionより良い方法は、カスタム クラスでラップすることです。

class NSURLAuthSession {
    private let urlSession: NSURLSession

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

したがって、より多くの制御とカスタマイズのオプションがあります。

于 2015-10-05T14:06:14.743 に答える
1

「ダミー」イニシャライザのみが公開されている理由は、UIKit の開発者が NSURLSession をサブクラス化することを望んでいないためです。独自の URL を提供するだけの場合は、NSURLSession に便利なメソッドを記述するか、既存の API を使用して自分で構成します。

于 2015-10-05T14:46:26.407 に答える