Swift 具有不同参数的函数
我有一个函数,其中两个参数可以是Swift 具有不同参数的函数,swift,Swift,我有一个函数,其中两个参数可以是[Int]?或Int。我真的需要定义4个函数来解决这个问题吗 func add(x : Float, y : Float, z : Float, out : [Int]? = nil, incoming : [Int]? = nil) -> Bool { func add(x : Float, y : Float, z : Float, out : Int, incoming : [Int]? = nil) -> Bool { fun
[Int]?
或Int
。我真的需要定义4个函数来解决这个问题吗
func add(x : Float, y : Float, z : Float, out : [Int]? = nil, incoming : [Int]? = nil) -> Bool {
func add(x : Float, y : Float, z : Float, out : Int, incoming : [Int]? = nil) -> Bool {
func add(x : Float, y : Float, z : Float, out : [Int]? = nil, incoming : Int) -> Bool {
func add(x : Float, y : Float, z : Float, out : Int, incoming : Int) -> Bool {
//更新
我发现一个变量可以有多个类型。但它似乎不适用于数组(或者至少我不知道如何更改代码)。您可以始终将单个值包装在数组中,并将其传递给以数组作为其输入参数的版本 如果您想在接口级别公开所有4个版本,但不想复制实现,那么只需从版本内部调用数组版本,并使用单个元素即可
func add(x: Float, y: Float, z: Float, out: [Int]? = nil, incoming: [Int]? = nil) -> Bool {
...
}
func add(x: Float, y: Float, z: Float, out: Int, incoming: [Int]? = nil) -> Bool {
add(x: x, y: y, z: z, out: [out], incoming: incoming)
}
func add(x: Float, y: Float, z: Float, out: [Int]? = nil, incoming: Int) -> Bool {
add(x: x, y: y, z: z, out: out, incoming: [incoming])
}
func add(x: Float, y: Float, z: Float, out: Int, incoming: Int) -> Bool {
add(x: x, y: y, z: z, out: [out], incoming: [incoming])
}
这是一个基于问题中链接的解决方案
protocol OneOrManyInt { }
extension Int: OneOrManyInt { }
extension Array: OneOrManyInt where Element == Int {}
func add(x : Float, y : Float, z : Float, out : OneOrManyInt? = nil, incoming : OneOrManyInt? = nil) -> Bool {...}
然后它可以像这样使用,例如
add(x: 1.0, y: 2.0, z: 3.0, out: [1,2,3], incoming: 10)
add(x: 1.0, y: 2.0, z: 3.0, incoming: 10)
add(x: 1.0, y: 2.0, z: 3.0, out: [1,2,3])
这是一个非常奇怪的API设计。这些参数用于什么?@Alexander这两个参数可能连接到其他点。它们可以连接到0、1或多个其他点。大多数情况下,它们都连接到另一个点,因此不方便将此单个值放入
[]
中。这样的参数越多,不显示的情况就越严重。你们谈论点,但实际上这里并没有点,只是随机的整数串。这些点是图形、网格还是类似的东西?看起来您在这里缺少了一些域模型,这些模型确实可以解决这个问题。@Alexander数据来自一个XML文件。我想添加更多的点,连接其中的一些点,然后将数据写回XML文件。当然,我不会编写多余的代码,我会按照您提到的那样做。问题是:我必须定义4个函数吗?@ChristophSchreiber考虑到4个函数中有3个调用同一个第4个实现,你只能定义1个。实际上,这取决于你想要实现的接口。你很棒。我总是尝试类似于扩展数组的方法,其中…
您可以通过在序列
或随机访问集合
上定义扩展来应用相同的解决方案,而不是在数组
上定义扩展,以获得更大的灵活性。然后,例如,有人可以传入一个ArraySlice
(例如someArray[i.)。。