【发布时间】:2022-08-02 16:47:48
【问题描述】:
我正在将 Objective-C 框架的一部分移植到 Swift,但我遇到了一个我想不出如何解决的问题。作为其中一个类的一部分,我需要存储 URLSession 来访问远程 API,并且我希望能够将其作为实例变量存储在要作为其委托的类上。不幸的是,我似乎无法弄清楚如何在 Swift 中执行此操作,因为编译器要么决定我在调用 super.init 之前引用 self,要么我在初始化所有之前调用 super.init实例变量。不幸的是,这两个条件不能同时满足,这让我想知道如何正确地做到这一点。人们已经就其他类提出了这个问题,但我没有找到任何专门针对 URLSession 的东西,它的独特之处在于它无法更改委托(即委托必须传递给初始化程序)。
实际上,我希望这两个选项之一有效:
class Foo
{
let session: URLSession
public init()
{
super.init()
// Compiler error on this line: Property \'self.session\' not initialized at super.init call
self.session = URLSession(configuration: /* configuration object */, delegate: self, delegateQueue: nil)
}
}
或者
class Foo
{
let session: URLSession
public init()
{
// Compiler error on this line: \'self\' used before super.init call
self.session = URLSession(configuration: /* configuration object */, delegate: self, delegateQueue: nil)
super.init()
}
}
我能想到的唯一解决方法是将属性更改为可变并使用可选类型,但这确实不是最佳的,尤其是对于在 Objective-C 中如此简单的行为。
标签: ios swift cocoa delegates nsurlsession