【问题标题】:Using self as delegate in initializer for instance variable swift在初始化程序中使用 self 作为委托,例如变量 swift
【发布时间】: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


    【解决方案1】:

    您可以使其成为计算属性。

    public class Foo: NSObject, URLSessionDelegate {
        
        var session: URLSession {
            URLSession(configuration: .default, delegate: self, delegateQueue: nil)
        }
        
        /*
         // OR
         lazy var session: URLSession = {
         return URLSession(configuration: .default, delegate: self, delegateQueue: nil)
         }()
         */
        
        public override init() {
            super.init()
        }
    }
    

    【讨论】:

      【解决方案2】:

      懒惰地初始化变量

      class Foo
      {
         lazy var bar: Bar = {
             return Bar(delegate: self)
         }()
      
         init()
         {
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 2021-08-19
        相关资源
        最近更新 更多