【问题标题】:Replacing Func Parameter with Tuple用元组替换 Func 参数
【发布时间】:2020-08-13 00:53:28
【问题描述】:

斯威夫特
我一定是误会了什么

func test(_ x: 0, y: 0) { /* code */ }

let a = test
test(x: 1, y: 2) // This is ok

我正在尝试传递元组以替换参数。

a.(x: 0, y: 0) // Not ok
a.(0, 0) // Not ok

let b = (x: 1, y: 2)
a.b // This is also not ok

我希望将可变参数和元组用于像这样很酷的东西:

func test(_ x: Int...) { /* code */ }
test.(0)
test.(0, 0, 0)
test.(0, 1, 2, 3)

let tuple = (1, 1, 1, 1, 1)
test.tuple

我觉得这应该可行

【问题讨论】:

  • 当我放置一个“.”时在值之后,Swift 允许我这样做。但随后它会引发错误..
  • 有什么问题?
  • @matt - func hello(a: Int) {} --- hello(a: 5) --- 我将 (a: 5) 视为一个元组。如果我像这样在“你好”之后加上句号:“你好”。它让我可以选择添加自我或添加参数。我想知道是否可以使用元组,因为参数是元组。 --- 对不起,我希望这会有所帮助。
  • @jonathan,直到 Xcode 7 可以将元组作为输入参数传递给函数(类型、参数数量应该匹配,不适用于默认值和可选)。但这已经不可能了。
  • 非常感谢@RubiyaFaniband!我将在 GitHub 的 Swift Evolution 中找到这种变化。

标签: swift function parameters tuples variadic


【解决方案1】:

首先,您将参数传递给圆括号内的函数,而不是使用点 (.)

如果你想将元组传递给一个函数,你可以这样做 a((0, 0))

如果您想将未知大小的元组传递给函数,您可以使用泛型。 此解决方案的缺点是您只能处理固定数量的元组长度。 我想不出更好的方法来做到这一点......

例如:

func f<T>(_ arg : T) {
    if arg is (Int) { print ("1") }
    if arg is (Int, Int) { print ("2") }
    if arg is (Int, Int, Int) { print ("3") }
    ...
    if arg is (Int, Int, Int, Int, Int, Int, Int) { print ("7") }
}
let x = (1, 2)
f(x)
// prints 2

【讨论】:

  • 甜蜜!这很棒!我可以将“ifs”转换为 switch 语句,然后检查 (_, Int, _, _) 和其他语法糖的情况。太棒了,谢谢!
猜你喜欢
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2012-09-02
  • 2020-04-08
  • 2011-12-14
相关资源
最近更新 更多