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实例的方法。
答案 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)
}