在 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()