在Swift中修改引用类型参数;外面是否立即可见变化?

时间:2017-03-31 20:56:34

标签: swift multithreading parameters pass-by-reference swift-playground

我有一个Swift游乐场,其中包含源文件夹中的几个类。这些类具有tick()函数,使用while true { }尽可能快地调用这些函数。我使用并行线程来执行此操作,以阻止Xcode锁定,使用以下代码:

DispatchQueue.global(qos: .background).async {
    BackgroundThread.startMainLoop(scene: scene)
}

// other file
public struct BackgroundThread {
    public static func startMainLoop (scene: SKScene) {
        let songController = SongController()
        let uiManager = UIManager(scene: scene)

// The UIManager is going to modify this scene.
// Will the changes be available to BackgroundThread and/or the main file?

        while true {
            songController.tick()
            uiManager.tick()
        }
    }
}

因为主要的游乐场脚本非常慢,所以我已经将重复循环移动到Sources文件夹中的已编译类。

我正在将一个SKScene对象传递给UIManager已编译的类,我需要在这个(相对复杂的)场景中更新UI,而不是主操场脚本可以管理的。

主要的playground脚本在并行线程中调用startMainLoop()函数。它传入SKScene对象。此函数永远不会返回,因为它包含一个永无止境的循环。有没有一种方法可以修改传递的对象,修改屏幕上显示的场景,实时,没有功能必须返回(这意味着inout不是一个选项),假设这不是默认发生?

1 个答案:

答案 0 :(得分:1)

引用类型表示该值是引用 - 即指向对象的指针。当您传递或分配引用时,您将获得引用的副本(它是没有inout的pass-by-value),但引用的多个副本指向同一个对象,并通过任何对象修改通过指向它的任何其他引用可以看到指向它的引用。