我在Playground中有以下代码-I' m learning delegation -...
import UIKit
protocol FollowThisProtocol {
func passingTheValue(aValue: String)
}
class IPassTheValues{
var aDelegate: FollowThisProtocol!
func runThisFunc(){
aDelegate.passingTheValue(aValue: "I like this game")
}
}
class IReceiveTheValues: FollowThisProtocol{
var localString: String!
var instanceOfClass: IPassTheValues!
func runReceivefunc(){
instanceOfClass.aDelegate = self
}
func passingTheValue(aValue: String) {
localString = aValue
}
}
当我尝试
时print(IReceiveTheValues().localString)
它给了我nil
如果我在尝试打印之前运行以下行(IReceiveTheValues()。localString) ...
,它也会给我nil
IPassTheValues()
IReceiveTheValues()
你能不能帮我理解为什么价值没有从第1班传到第2班......?
或者,如果您能在我的代码中发现与自身相矛盾的内容,请指出它吗?
感谢您的时间和帮助。
答案 0 :(得分:1)
在将自己指定为IPassTheValues
之前,您需要创建delegate
对象,然后在实例上调用runThisFunc()
:
func runReceivefunc(){
instanceOfClass = IPassTheValues()
instanceOfClass.aDelegate = self
instanceOfClass.runThisFunc()
}
然后测试:
// Create the `IReceiveTheValues` object
let irtv = IReceiveTheValues()
// Run the method
irtv.runReceivefunc()
// Get the resulting string
print(irtv.localString)
我建议另外两个更改。制作delegate
weak
,这样就不会出现保留周期,导致无法删除任何一个对象。为此,您需要在协议声明中添加: class
,因为只有参考对象(class
的实例)可以是weak
。
这是修改后的代码。试一试,看看删除weak
时会发生什么。
protocol FollowThisProtocol: class {
func passingTheValue(aValue: String)
}
class IPassTheValues{
weak var aDelegate: FollowThisProtocol!
func runThisFunc(){
print("Calling delegate...")
aDelegate.passingTheValue(aValue: "I like this game")
}
deinit {
print("IPassTheValues deinitialized")
}
}
class IReceiveTheValues: FollowThisProtocol{
var localString: String!
var instanceOfClass: IPassTheValues!
func runReceivefunc(){
instanceOfClass = IPassTheValues()
instanceOfClass.aDelegate = self
instanceOfClass.runThisFunc()
}
func passingTheValue(aValue: String) {
print("Receiving value from helper object...")
localString = aValue
}
deinit {
print("IReceiveTheValues deinitialized")
}
}
func test() {
let irtv = IReceiveTheValues()
irtv.runReceivefunc()
print(irtv.localString)
}
test()