Apple DemoBots 项目在使用 Swift5 的登陆页面停止

Kam*_*ack 2 xcode ios swift

我正在尝试使用 Swift 5运行 Apple 的示例 DemoBots ( https://developer.apple.com/library/archive/samplecode/DemoBots/Introduction/Intro.html#//apple_ref/doc/uid/TP40015179 ) 项目,但是应用程序未加载超过徽标启动页面。

我已经更新了项目中所有 Swift3 已弃用的方法/属性,例如在 SceneMetadata 类中将过时的 hashValue 属性更改为哈希(进入 hasher: inout Hasher),将 isAsynchronous 添加到 SceneOperation 类等。

如果有人在使用 Swift5 运行 DemoBots 时遇到类似问题,请告诉我您是如何解决的。

这是我的场景操作代码:

class SceneOperation: Operation {
    // MARK: Types

    /**
        Using the `@objc` prefix exposes this enum to the ObjC runtime,
        allowing the use of `dynamic` on the `state` property.
    */
    @objc enum State: Int {
        /// The `Operation` is ready to begin execution.
        case ready

        /// The `Operation` is executing.
        case executing

        /// The `Operation` has finished executing.
        case finished

        /// The `Operation` has been cancelled.
        case cancelled
    }

    // MARK: Properties

    /// Marking `state` as dynamic allows this property to be key-value observed.
    @objc dynamic var state = State.ready

    // MARK: NSOperation

    override var isReady: Bool {
        return state == .ready && super.isReady
    }

    override var isExecuting: Bool {
        return state == .executing
    }

    override var isFinished: Bool {
        return state == .finished
    }

    override var isCancelled: Bool {
        return state == .cancelled
    }

    override var isAsynchronous: Bool {
        return true
    }

    /**
        Add the "state" key to the key value observable properties of `NSOperation`.
    */
    dynamic class func keyPathsForValuesAffectingIsReady() -> Set<String> {
        return ["state"]
    }

    dynamic class func keyPathsForValuesAffectingIsExecuting() -> Set<String> {
        return ["state"]
    }

    dynamic class func keyPathsForValuesAffectingIsFinished() -> Set<String> {
        return ["state"]
    }

    dynamic class func keyPathsForValuesAffectingIsCancelled() -> Set<String> {
        return ["state"]
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序成功构建,没有运行时或编译时错误/警告。但它只在背景中显示 DemoBots 徽标和绿色粒子动画。没有任何菜单或关卡场景被渲染。

Teh*_*rew 5

最有可能的是,在将项目转换为最新版本的 Swift 时,您选择了禁用该@objc接口。不幸的是,如果没有这个,该项目将无法运行。您可以尝试Swift 3 @objc Inference在构建设置中打开。

或者在这里您可以获得支持 Swift 5 的 DemoBot 版本:https : //github.com/iTehdrew/DemoBot