【问题标题】:Initializer does not override a designated initializer while subclassing NSURLSession Swift在继承 NSURLSession Swift 时,初始化程序不会覆盖指定的初始化程序
【发布时间】:2015-10-05 13:47:07
【问题描述】:

我想继承 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

【问题讨论】:

    标签: swift nsurlsession subclassing nsurlsessionconfiguration


    【解决方案1】:

    你不能。

    唯一指定的初始化程序是NSURLSession.init(),您必须从子类初始化程序中调用它。 NSURLSession configurationdelegatedelegateQueue 属性是只读的,因此您不能手动设置它们。

    更好的方法是用自定义类包装NSURLSession

    class NSURLAuthSession {
        private let urlSession: NSURLSession
    
        init(urlSession: NSURLSession) {
            self.urlSession = urlSession
        }
    }
    

    因此您将拥有更多控制和自定义选项。

    【讨论】:

    • 感谢您的回复,只是为了澄清一下,可以使用配置和委托初始化 NSSession,但它的子类 NSURLAuthSession 不能?
    • 是的,因为子类必须调用父类指定的初始化器。你可以阅读更多关于指定初始化器和便利初始化器的信息,听developer.apple.com/library/ios/documentation/Swift/Conceptual/…
    【解决方案2】:

    只有“虚拟”初始化器被暴露的原因是 UIKit 的开发者不希望你继承 NSURLSession。如果您只想提供自己的 URL,请在 NSURLSession 上编写一个方便的方法,或者使用现有的 API 自行配置。

    【讨论】:

    • 为了添加方便的方法,我需要继承 NSURLSession(不推荐)对吗?
    • 不不不,只写一个 NSURLSession 的扩展。如下所示: extension NSURLSession { /*我的便利方法和东西*/}。不幸的是,您将无法将任何存储属性添加到目标类。我希望现在我的建议不是模棱两可的。 :)
    • 另外,为了以防万一(应该很明显),我没有提到方便关键字:)
    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多