2017-09-27 70 views
0

我試圖讓我的頭繞過Swift代表,並且偷走了一個Playground,但似乎無法獲得要調用的委託函數。Swift 3沒有調用的代理函數

protocol fBookDelegate:class { 
    func processData(data: String) 
} 

class fBook { 

weak var delegate: fBookDelegate? 

init() { 
    print("initialising fBook") 
    delegate?.processData(data: "hello world") 
    print("we should have printed") 
    } 
} 

class fMain: fBookDelegate { 
init() { 
    print("initialising fMain") 
    let getfBook = fBook() 
    getfBook.delegate = self 
    print("all done let's rumble") 
    } 

func processData(data: String) { 
    print("processing data from fBook with \(data)") 
    } 
} 

var controller = fMain() 

任何人都可以發現我的錯誤嗎?

我得到的輸出是

initialising fMain 
initialising fBook 
we should have printed 
all done let's rumble 
+0

你試圖使用委託在fBook的初始化,但你不設置它,直到你初始化後目的。 –

+0

修改fBook init以將委託作爲參數,而不是將其指定爲屬性。 – ghostatron

回答

2

你可以使用這樣的:

import UIKit 
protocol fBookDelegate:class { 
    func processData(data: String) 
} 
class fBook { 
    init(delegate: fBookDelegate?) { 
     print("initialising fBook") 
     delegate?.processData(data: "hello world") 
     print("we should have printed") 
    } 
} 
class fMain: fBookDelegate { 
    init() { 
     print("initialising fMain") 
     let getfBook = fBook(delegate: self) 
     print("all done let's rumble") 
    } 
    func processData(data: String) { 
     print("processing data from fBook with \(data)") 
    } 
} 

var controller = fMain() 

輸出:

initialising fMain 
initialising fBook 
processing data from fBook with hello world 
we should have printed 
all done let's rumble 
0

下面是使用委託一個選項:

protocol fBookDelegate:class { 
    func processData(data: String) 
} 

class fBook { 

    weak var delegate: fBookDelegate? 

    init() { 
     print("initialising fBook") 
    } 

    func talkToMe() { 
     delegate?.processData(data: "hello world") 
    } 
} 

class fMain: fBookDelegate { 
    init() { 
     print("initialising fMain") 
     let getfBook = fBook() 
     getfBook.delegate = self 
     getfBook.talkToMe() 
     print("all done let's rumble") 
    } 

    func processData(data: String) { 
     print("processing data from fBook with \(data)") 
    } 
} 

var controller = fMain() 

另一種是自定義的初始化方法,它採用的委託作爲參數。

+0

好吧,也許我不理解委託,但理想情況下,我希望從fBook調用它,例如,當點擊一個按鈕或點擊表格時。然後將對象/數據/字符串從fBook發送到fMain,我可以在其中更新UI。我是否以這種錯誤的方式來回答這個問題? – depicus

+0

對我來說聽起來很好。基本上,你所要做的就是用某種IBAction方法替換'talkToMe',它會響應你想要處理的事件類型。不過,我的觀點是,在使用它之前你需要設置委託,或者如你所見,沒有任何反應。 –

+0

確保您的對象範圍也是正確的。如果你希望'fBook'在'fMain'完成它的'init'後做些事情,那麼必須保證它有效。 –