В чем проблема с этим простым примером конструктора функций Swift? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь поэкспериментировать с компоновщиками функций в 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)
}

1 Ответ

1 голос
/ 08 ноября 2019

Я думаю, ты пропустил шаг. Я думаю о создателях функций как об аннотации, которую я должен добавить к функции, поэтому у аннотированной функции есть более приятный сайт вызова (только некоторые значения внутри фигурных скобок, которые могут помочь в быстрой компоновке / гроккинге). Я не знаю много о 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() }

...