在 Playground 中测试委托 'nil'
Testing Delegation in Playground giving 'nil'
我在 Playground 中有以下代码 - 我正在学习委托 -...
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
如果我 运行 在尝试 print(IReceiveTheValues().localString)...
IPassTheValues()
IReceiveTheValues()
你能帮我理解为什么值没有从第一个class传递到第二个..吗?
或者,如果您能在我的代码中发现一些自相矛盾的地方,请您指出来...?
感谢您的宝贵时间和帮助。
您需要在将自己指定为 delegate
之前创建 IPassTheValues
对象,然后在实例上调用 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)
我建议进行另外 2 项更改。让你的 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()
我在 Playground 中有以下代码 - 我正在学习委托 -...
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
如果我 运行 在尝试 print(IReceiveTheValues().localString)...
IPassTheValues()
IReceiveTheValues()
你能帮我理解为什么值没有从第一个class传递到第二个..吗?
或者,如果您能在我的代码中发现一些自相矛盾的地方,请您指出来...?
感谢您的宝贵时间和帮助。
您需要在将自己指定为 delegate
之前创建 IPassTheValues
对象,然后在实例上调用 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)
我建议进行另外 2 项更改。让你的 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()