Swift Playgrounds (iPad) 未构建具有已实现 ARSessionDelegate.session(_:didUpdate:) 函数的应用

Swift Playgrounds (iPad) does not build an app with implemented ARSessionDelegate.session(_:didUpdate:) functions

我在尝试根据 Apple 的官方示例 “Building an immersive experience with RealityKit” 实现 ARViewARSessionDelegate 的 SwiftUI 表示时发现错误。

有错误

Method '__preview__session(_:didUpdate:)' with Objective-C selector '__preview__session:didUpdate:' conflicts with previous declaration with the same Objective-C selector

我准备了以下示例来轻松重现这一点。


import ARKit
import RealityKit
import SwiftUI

struct ContentView: View {
    var body: some View {
        RealityKitView()
    }
}

private struct RealityKitView: UIViewRepresentable {
    class Coordinator: NSObject, ARSessionDelegate {
        func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { }
        func session(_ session: ARSession, didUpdate frame: ARFrame) { }
    }
    
    func makeCoordinator() -> Coordinator { Coordinator() }
    
    func makeUIView(context: Context) -> ARView {
        let view = ARView()
        let session = view.session
        let config = ARWorldTrackingConfiguration()
        config.planeDetection = [.horizontal]
        session.run(config)
        session.delegate = context.coordinator
        return view
    }
    
    func updateUIView(_ view: A.  RView, context: Context) { }
}

一个非常有趣的时刻是,上面的这段代码可以使用一般 Swift Playgrounds 的游乐场或 Xcode 成功构建,但不能在 Swift Playgrounds 的应用程序中构建。

有什么解决方法吗?

此外,从同一个 Apple 的 Underwater 示例 (FoodPool.swift) 中发现了另一个奇怪的错误 'Scene' is ambiguous for type lookup in this context。我简化了内容以说明问题出在哪里,但是这段代码没有任何问题。

import RealityKit

class FoodPool {
    private let arView: ARView
    private var scene: Scene { arView.scene } // Error: 'Scene' is ambiguous for type lookup in this context
    
    init(arView: ARView) { 
        self.arView = arView
    }
}

除了 ARSessionDelegate 问题之外,这个问题可以通过直接使用 arView.scene 来解决(删除第 5 行会有帮助)。

总的来说,似乎隐藏着更复杂的问题。

解决方法

给定 一个带有 fake :D 错误的文件,并且已在文件中完成计划的更改, 选择了另一个有效文件,并重新加载项目(或 Swift 重述 Playgrounds), 然后 项目可以 运行 成功如果没有其他错误,请离开。

这帮助我解决了 ARSessionDelegate 问题,并在 iPad 上 运行 宁 the Underwater example