将实例作为引用传递给 swift 中的另一个类

Rob*_*ena 1 ios swift swift3

Swift 新手,我试图将一个类的实例传递给另一个类,但编辑器一直将其标记为错误,这是我的代码:

ViewController.swift

import UIKit
import Foundation

class ViewController: UIViewController {

    let handler: Handler = Handler(controller: self)

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
Run Code Online (Sandbox Code Playgroud)

Handler.swift

import Foundation

class Handler
{
    var controller: ViewController? = nil

    init(controller: ViewController) {
      self.controller = controller
    }
}
Run Code Online (Sandbox Code Playgroud)

该行let handler: Handler = Handler(controller: self)给出以下错误:

Cannot convert value of type '(NSObject) -> () -> ViewController' to expected argument type 'ViewController'
Run Code Online (Sandbox Code Playgroud)

我来自 java、c#、php 背景,据我所知,这些语言self相当于this,但我不知道如何传递实例。

任何输入都将受到赞赏,这样做的目的是让 Handler 类可以调用活动 ViewController 实例的方法。

And*_*eas 5

这与 Swift 中对象的初始化有关。您在初始化self时无权访问。handler

要修复它,你可以写

lazy var handler: Handler = Handler(controller: self)
Run Code Online (Sandbox Code Playgroud)

这将初始化推迟到第一次访问时。

有关两阶段初始化的文档

Swift 中的类初始化是一个两阶段的过程。在第一阶段,每个存储的属性都由引入它的类分配一个初始值。一旦确定了每个存储属性的初始状态,第二阶段就开始,并且每个类都有机会在新实例被认为可供使用之前进一步自定义其存储属性。

这意味着在您尝试访问 时,并非所有属性都保证已初始化self,因此您无法访问该对象。