6

我想把头绕过去@_functionBuilder。有一种情况我无法弄清楚。

我把这个简单的例子放在一起,当有两个乘客时,效果很好。但是当只有 1 我得到这个错误:

error: FunctionBuilder.playground:21:5: error: cannot convert value of type 'Passanger' to closure result type '[Passanger]'

@_functionBuilder
struct PassangerBuilder {
    static func buildBlock(_ passangers: Passanger...) -> [Passanger] {
        return passangers
    }
}

struct Passanger {
    let name: String
}

struct Car {
    let passangers: [Passanger]

    init(@PassangerBuilder _ builder: () -> [Passanger]) {
        self.passangers = builder()
    }
}

Car {
    Passanger(name: "Tom")
//    Passanger(name: "Mary")
}
4

2 回答 2

7

我的解决方案是添加更多的 init 函数,单项 Passanger 返回到 struct Car。这将是:

struct Car {
    let passangers: [Passanger]

    init(@PassangerBuilder _ builder: () -> [Passanger]) {
        self.passangers = builder()
    }

    init(@PassangerBuilder _ builder: () -> Passanger) {
        self.passangers = [builder()]
    }
}

希望能帮到你

于 2019-08-18T09:13:29.523 回答
1

对于其他任何人在这里结束。

正如我在CRD 引用的问题上回答的那样,函数构建器的当前实现存在一个错误,当只有一个值可用时,它会忽略函数构建器。它已在 Swift 5.3 上修复并在 Xcode 12 上可用。

Thanh Vu 的重载解决方案目前有效,但您甚至不需要@PassangerBuilder注释。

于 2020-07-30T04:30:45.913 回答