【问题标题】:Function with different parameters不同参数的函数
【发布时间】:2021-06-21 08:19:18
【问题描述】:

我有一个函数,其中 2 个参数可以是 [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 {

//更新

我发现this posting 变量可以有多个类型。但它似乎不适用于数组(或者至少我不知道如何更改代码)。

【问题讨论】:

  • 这是一个非常奇怪的 API 设计。这些参数是做什么用的?
  • @Alexander 这两个参数可能连接到其他点。它们可以连接到 0、1 或更多其他点。大多数情况下它们都连接到另一个点,因此将这个单个值放入[] 是不方便的。
  • 这样的论点越多,不喷溅的情况就越糟糕。 forums.swift.org/t/explicit-array-splat-for-variadic-functions/…
  • 你说的是积分,但实际上这里没有任何积分,只是随机的整数束。这些点是图形还是网格或类似的东西?看起来您在这里缺少一些域模型,这真的可以解决这个问题。
  • @Alexander 数据来自 XML 文件。我想添加更多点,连接其中一些并将数据写回 XML 文件。

标签: swift


【解决方案1】:

这是基于问题中链接的解决方案

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])

【讨论】:

  • 你很棒。我总是尝试类似extension Array where ...
  • 您可以通过在SequenceRandomAccessCollection 上而不是Array 上定义扩展名来应用相同的解决方案,以获得更大的灵活性。然后,例如,有人可以传入ArraySlice(如someArray[i..<j])或someArray.reversed()作为参数。
【解决方案2】:

您始终可以将单个值包装在数组中,并将其传递给以数组作为输入参数的版本。

如果您想在接口级别公开所有 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])
}

【讨论】:

  • 我当然不会写多余的代码,会按照你说的去做。问题是:我必须定义 4 个函数吗?
  • @ChristophSchreiber 考虑到 4 个函数中有 3 个调用相同的第 4 个实现,实际上您只能定义 1 个,这实际上取决于您要实现的接口是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多