测试代表团在游乐场给予' nil'

时间:2017-07-07 15:23:19

标签: swift swift-playground delegation

我在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班......?

或者,如果您能在我的代码中发现与自身相矛盾的内容,请指出它吗?

感谢您的时间和帮助。

1 个答案:

答案 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()
相关问题