2016-10-31 15 views
1

ここでは、クラスのインスタンスを別のクラスに渡そうとしていますが、エディタはそれを間違いとしてマークしています。これはコードです。すぐに別のクラスへの参照としてインスタンスを渡す

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のと同じです、まだ私はインスタンスを渡す方法を見つけ出すことはできません。

これは、ハンドラクラスがアクティブなViewControllerインスタンスのメソッドを呼び出すことができるようにするためのものです。

答えて

2

ViewControllerオブジェクトはまだ初期化されていません。それがその理由です。単にハンドラをオプションvarにして、内部で初期化することができます。

var handler: Handler? // optional variable 

override func viewDidLoad() { 
    super.viewDidLoad() 

    handler = Handler(controller: self) 
} 
3

これは、Swiftのオブジェクトの初期化に関係します。 handlerの初期化時にselfへのアクセス権がありません。それを修正する

、あなたが

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

を書くことができこれは、それが最初にアクセスの時刻に初期化を延期します。

Documentation on two-phase initialization

は:

Class initialization in Swift is a two-phase process. In the first phase, each stored property is assigned an initial value by the class that introduced it. Once the initial state for every stored property has been determined, the second phase begins, and each class is given the opportunity to customize its stored properties further before the new instance is considered ready for use.

これは、すべてのプロパティは、したがって、あなたがオブジェクトにアクセスすることを防止している、あなたはselfにアクセスしようとする時に初期化されていることが保証されていないことを意味します。

関連する問題