2016-02-13 6 views
8

私は代表団の周りに頭を抱えようとしており、それを基本的な実装に取り​​除いています。私はこれを考え出しましたが、デリゲート関数は決して呼び出されません。誰か光を当てることができるだろうか?これは方法です、あなたのコードを使用してSwiftでの委任の基本的な実装を行うにはどうすればよいですか?

class DelegateClass: MyDelegate { 
    func delegatedFunction (a:String){ 
     print(a) 
    } 

    func testFunction() { 
     var delegator=DelegatorClass() 
     delegator.delegate=self 
     delegator.callDelegate() 
    } 
} 
+0

delegateプロパティにselfを割り当てるので、重要性、それに対してプロトコル機能を呼び出すことができるようにclass DelegatorClassで、delegateプロパティは、protocol MyDelegateのタイプのオブジェクトを割り当てることが期待されます呼び出しを続行する前に、変数 "delegate"をDelegateClassに関連付けます。この場合、ランタイムエラーであるnil値以上の関数を呼び出すことになります。 – kandelvijaya

+0

委任は、オブジェクトのインタフェースベースの構成に似ています。これは、オブジェクトと責任を切り離す方法です。デザインパターンでヘッドファーストの最初の3つの章を読んでいただければ幸いです。 – kandelvijaya

答えて

1

DelegateClassのインスタンスはそうDelegatorClass

のインスタンスの代理人としての地位を設定する必要がある、あなたのようなものを持っているでしょう代理人を適切に使用する。あなたがcallDelegate()を呼び出すとき 、それはDelegateClassの参照を取り、更なる情報については、アップルのプロトコルのドキュメンテーションでdelegatedFunction()

protocol MyDelegate{ 
    func delegatedFunction (a:String) 
} 

class DelegatorClass { 
    var delegate: MyDelegate? 
    func callDelegate() { 
     delegate?.delegatedFunction("hello") 
    } 
} 

class DelegateClass: MyDelegate { 
    let my_class= DelegatorClass() 
    my_class.delegate = self 

    func delegatedFunction (a:String){ 
     print(a) 
    } 
} 

ルックを実行します。あなたはdelegateを割り当てる必要がcallDelegate()呼び出す前に https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

4

protocol MyDelegate{ 
    func delegatedFunction (a:String) 
} 

class DelegatorClass { 
    var delegate: MyDelegate? 
    func callDelegate() { 
     delegate?.delegatedFunction("hello") 
    } 
} 

class DelegateClass: MyDelegate { 
    func delegatedFunction (a:String){ 
     print(a) 
    } 
} 
+0

let class = DelegatorClass()//キーワード 'class'は識別子として使用できません class.delegate = self //期待される宣言 –

+1

ups、私の悪い、私はそれをテストしませんでした、私は編集しますポスト。 – UlyssesR

+0

よかった、ありがとう。この行: "my_class.delegate = self"は、依然としてExpected宣言エラーを出しています。どんな考え?その行は関数の中にあるべきですか? –

7
let myDelegatorObj = DelegatorClass() 
myDelegatorObj.delegate = DelegateClass() 
myDelegatorObj.callDelegate() 

ポイントです。委任を確認するには、DelegatorClassを代理人で初期化することができます。

class DelegatorClass { 
    var delegate: MyDelegate? = DelegateClass() 
    func callDelegate() { 
     delegate?.delegatedFunction("hello") 
    } 
} 
+2

これは行く方法のように見えます。しかし、私は、最初の例と2番目の例が委任をアクティブにするための異なるアプローチであると指定します。最初の例は、デリゲートクラスのハードコーディングを行わずに、デリゲートクラスの別のアイランドを使用することを許可するので、最も汎用性があります。 –

+0

@MarcoPappalardoあなたは正しいです。 2番目の例はテストのみです。 –

3

サンプルの遊び場でテストされ、作業しています。

import UIKit 

protocol MyDelegate { 
    func delegatedFunction(a: String) 
} 

class DelegatorClass { 

    var delegate: MyDelegate? 

    func callDelegate() { 
     delegate?.delegatedFunction("Hello World!") 
    } 
} 

class DelegateClass: MyDelegate { 

    let my_class = DelegatorClass() 

    init() { 
     my_class.delegate = self 
    } 

    // MyDelegate Protocol implementation 
    func delegatedFunction(a: String) { 
     print(a) 
    } 

} 

次の行を追加してください。

let c = DelegateClass() 
c.my_class.callDelegate() 

説明するために、あなたはDelegateClass cのインスタンスを作成し、それが初期化されている

は、init方法が実行されます。 DelegatorClassインスタンスmy_classメンバーdelegateには、DelegateClassであるselfへの参照が保持されるようになりました。今

callDelegate()

方法が実行される、オプションの変数delegateは現在DelegateClassインスタンスへの参照を保持しているので、それは基本的にdelegatedFunction(a: String)メソッドの実行を要求します。したがって、文字列aが印刷されます。

my_class.delegate = selfinit()の中に入れなければならない理由は、クラス内のメソッドの外にインスタンスプロパティ宣言を持つことができるからです。すべての機能はメソッドの中に入れなければなりません。

説明が明確になることを願っています! :)

-1
protocol Delegate{ 

    func callMe() 
    func textMe() 
} 

@objc protocol DelegateWithOptional: class{ 

    optional func callMe() 
    func textMe() 
} 

class SomeClass{ 

    var delegate: Delegate? 

    func call(){ 
     delegate?.callMe() 
    } 

    func text(){ 
     delegate?.textMe() 
    } 

} 

class SomeClass2{ 

    var delegateWithOptional: DelegateWithOptional? 

    func call(){ 
     delegateWithOptional?.callMe() 
    } 

    func text(){ 
     delegateWithOptional?.textMe() 
    } 
} 

class ClassConfirmingToProtocol: SuperClass, Delegate{ 

    var someClass = SomeClass() 
    override func viewDidLoad(){ 
     someclass.delegate = self 
    } 

    //must implement this method 
    func textMe(){ 
     //do something 
    } 

    //must implement this method 
    func callMe(){ 
     //do something 
    } 

} 

class ClassConfirmingToProtocolWithOptional: SuperClass, DelegateWithOptional{ 

    var someClass2 = SomeClass2() 
    override func viewDidLoad(){ 
     someclass2.delegate = self 
    } 

    //must implement this method 
    func textMe(){ 
     //do something 
    } 

    //optional to implement this method, i.e. even without this method, its not gonna throw any error 
    func callMe(){ 
     //do something 
    } 

} 
4
protocol MyDelegate{ 
    func delegatedFunction (a:String) 
} 

class DelegatorClass { 
    var delegate: MyDelegate? 
    func callDelegate() { 
     delegate?.delegatedFunction("hello") 
    } 
} 

class DelegateClass: MyDelegate { 
    func delegatedFunction (a:String){ 
     print(a) 
    } 
} 
let delegator = DelegatorClass() 
delegator.callDelegate() // print nothing, because delegate is nil by default 

// set your delegate !!!!!!! 
delegator.delegate = DelegateClass() 
delegator.callDelegate() // print "hello" 

それはちょうどそれを右の方法を使用して、あなたのアプローチには何もありません。このポイントは、MyDelegateプロトコルに準拠したタイプTのインスタンスに代理変数を設定します。あなたの場合、これはDelegateClassインスタンスです。 一般に、TはMyDelegateプロトコルに準拠したほぼすべてのものです。

struct S:MyDelegate { 
    func delegatedFunction(a: String) { 
     print("Hello from struct conforming to MyDelegate protocol") 
    } 
} 

delegator.delegate = S() 
delegator.callDelegate() // print "Hello from struct conforming to MyDelegate protocol" 

delegator.delegate = nil 
delegator.callDelegate() // print nothing again :-) 
2

あなたはほとんどそれを持っていた、あなたは、単にいくつかの他のひねりで、class DelegateClassdelegateclass DelegatorClassにプロパティを割り当てることを忘れていました。

class DelegateClassには、protocol MyDelegateに準拠するように伝えられています。つまり、delegatedFunction(a:String)を実装する必要があります。それはあなたが必要DelegateClass

protocol MyDelegate{ 
    func delegatedFunction(a:String) 
} 

class DelegatorClass { 
    var delegate: MyDelegate! = nil 
    func callDelegate() { 
     delegate.delegatedFunction("hello") 
    } 
} 

class DelegateClass: MyDelegate { 
    var delegator:DelegatorClass = DelegatorClass() 

    init() { 
     delegator.delegate = self 
     delegator.callDelegate() 
    } 
    func delegatedFunction (a:String){ 
     print(a) 
    } 
} 
関連する問題