Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 具有不同参数的函数_Swift - Fatal编程技术网

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.)。。