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

时间:2016-10-31 19:18:03

标签: 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()
    }

}

Handler.swift

import Foundation

class Handler
{
    var controller: ViewController? = nil

    init(controller: ViewController) {
      self.controller = controller
    }
}

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

Cannot convert value of type '(NSObject) -> () -> ViewController' to expected argument type 'ViewController'

我来自java,c#,php背景,据我所知self相当于this这些语言,但我无法弄清楚如何通过实例

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

2 个答案:

答案 0 :(得分:3)

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

要修复它,你可以写

lazy var handler: Handler = Handler(controller: self)

这会将初始化推迟到首次访问时。

Documentation on two-phase initialization

  

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

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

答案 1 :(得分:2)

尚未初始化ViewController对象。这就是它的原因。您只需将处理程序设为可选var并在viewDidLoad()函数

中初始化它
var handler: Handler? // optional variable

override func viewDidLoad() {
    super.viewDidLoad()

    handler = Handler(controller: self)
}