首页 > 解决方案 > 这个简单的 Swift 函数构建器示例有什么问题?

问题描述

我正在尝试使用 XCode 11 中的函数构建器并构建了这个简单的游乐场。它似乎没有使用函数构建器将输入转换为所需的结果闭包,但我觉得我一定在某处遗漏了这一点。最后一行报告的错误是cannot convert value of type '(Int, Int)' to closure result type 'Scene'

import SpriteKit

public protocol Scene {
    var width   : Int {get}
    var height  : Int {get}
}

public struct EmptyScene : Scene {
    public let width : Int
    public let height: Int
}

@_functionBuilder public struct SceneBuilder {
    public static func buildBlock(_ size:(Int,Int))->Scene {
        return EmptyScene(width: size.0, height: size.1)
    }
}

extension SKScene {
    public convenience init(@SceneBuilder _ scene :  () -> Scene){
        let definition = scene()
        self.init(size: CGSize(width: definition.width, height: definition.height))
    }
}

SKScene {
    (320,256)
}

标签: swiftfunction-builder

解决方案


我认为你错过了一步。我认为函数构建器是我必须添加到函数的注释,因此带注释的函数具有更好的调用站点(只有大括号内的一些值,可以帮助快速组合/探索)。我对 SpriteKit 了解不多,但编译器对此很满意:

import PlaygroundSupport
import SpriteKit

import SpriteKit

public protocol Scene {
    var width   : Int {get}
    var height  : Int {get}
}

public struct EmptyScene : Scene {
    public let width : Int
    public let height: Int
}

@_functionBuilder public struct SceneBuilder {
    public static func buildBlock(_ size:(Int,Int))->Scene {
        return EmptyScene(width: size.0, height: size.1)
    }
}

extension SKScene {
    public convenience init(@SceneBuilder _ scene :  () -> Scene){
        let definition = scene()
        self.init(size: CGSize(width: definition.width, height: definition.height))
    }
}

*here*

@SceneBuilder
func buildDaScene() -> Scene { (320, 256) }

SKScene { buildDaScene() }


推荐阅读