2017-09-27 94 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'后做些事情,那么必须保证它有效。 –