8865


`delegate`の使い方の練習をしようと思い`playground`で以下のコードを記述したのですが、`test.delegate =
self`の行で「`Expected
declaration`」というエラーが表示されてしまい、どうすればいいか分からなくなってしまいました。`test.callMethod1()`や`test.callMethod2()`の行でもこのエラーが発生します。どうすればよろしいでしょうか？  
どなたか分かる方がいれば教えていただきたいです。すみませんが、よろしくお願いします。

[code]

    protocol TestDelegate {
        func delegateMethod1()
        func delegateMethod2()
    }
    
    class Test {
        let delegate: TestDelegate!
    
        func callMethod1() {
            delegate.delegateMethod1()
        }
    
        func callMethod2() {
            delegate.delegateMethod2()
        }
    }
    
    class Swift: TestDelegate {
        let test = Test()
        test.delegate = self
    
        test.callMethod1()
        test.callMethod2()
    
        func delegateMethod1() {
            println("this is delegateMethod 1")
        }
    
        func delegateMethod2() {
            println("this is delegateMethod 2")
        }
    }
    
[/code]


CC BY-SA 3.0
2015-04-07T09:20:57.567
8862
2015-04-07T09:45:51.597
5210
question
swift delegate
Expected declaration


エラーの出ている箇所はそこがクラスの中なので、書けるのはインスタンス変数やメソッドの定義など限られたものだけだからです。そこに処理をなんでも書けるわけではないです。

[code]

    class Swift: TestDelegate {
        let test = Test() // これはインスタンス変数（定数）の定義なのでOK
        test.delegate = self // これは手続きなのでダメ
    
        test.callMethod1() // 同上
        test.callMethod2() // 同上
    
[/code]

直し方はいくつかありますが、例えば次のように、処理を書いているところをメソッドにして、そのメソッドを改めてクラスの外で呼び出すようにすると、おそらく望み通りの動作になるかと思います。

[code]

    class Swift: TestDelegate {
    
        func testMethod() {
            let test = Test()
            test.delegate = self
    
            test.callMethod1()
            test.callMethod2()
        }
    
[/code]

↑ まず一連の処理を`testMethod()`というメソッドに包む。

[code]

    var swift = Swift()
    swift.testMethod()
    
[/code]

↑ そしてクラスの外で、このように改めてSwiftクラスのインスタンスを作って`testMethod()`を呼び出します。

あと、下の`let delegate`の変数は`let`だと再代入できないので、`var`で変数として定義する必要があります。

[code]

    let delegate: TestDelegate!
    
[/code]

上記の修正を加えた全部のコードは下記になります。

[code]

    protocol TestDelegate {
        func delegateMethod1()
        func delegateMethod2()
    }
    
    class Test {
        var delegate: TestDelegate!
    
        func callMethod1() {
            delegate.delegateMethod1()
        }
    
        func callMethod2() {
            delegate.delegateMethod2()
        }
    }
    
    class Swift: TestDelegate {
    
        func testMethod() {
            let test = Test()
            test.delegate = self
    
            test.callMethod1()
            test.callMethod2()
        }
    
        func delegateMethod1() {
            println("this is delegateMethod 1")
        }
    
        func delegateMethod2() {
            println("this is delegateMethod 2")
        }
    }
    
    var swift = Swift()
    swift.testMethod()
    
[/code]


CC BY-SA 3.0
2015-04-07T09:45:51.597
8865
2015-04-07T09:45:51.597
5519
8862
answer