与Swift中的*args相当?

5
func sumOf(numbers: Int...) -> Int {
    var sum: Int = 0
    for number in numbers {
       sum += number
    }
    return sum
}
sumOf(1, 2, 3) //6

这是从Swift iBook中提取的示例代码。它可以找到任意数量参数的总和。
相当于Python代码如下:
def sumOf(*args):
    sum = 0
    for number in args:
        sum += number
    return sum
sumOf(1, 2, 3) #6

在Python中,*args接受所有变量类型,因此如果出于任何原因我想要这样做,我可以这样编写代码:
def sumOf(*args):
    sum = ""
    for number in args:
        sum += str(number)
    return sum
sumOf(1, "test", 3) #"1test3"

我该如何在Swift中实现这个?我该如何创建一个函数,该函数可以接受任何类型的可变参数?虽然不一定需要这样做,但我还是想知道如何实现。

谢谢。


Swift 作为一种语言的中心设计方面之一是严格类型。如果您想在函数内部对参数列表执行任何操作,则所有参数都应至少符合一个公共协议(Any 将是每个对象都符合的协议,但它除了满足编译器外没有任何帮助 - 您不能 对象执行任何操作)。然后,您可以使用公共协议作为可变参数列表的类型。 - Thorsten Karrer
1个回答

3
像这样的东西吗?
func concatOf(args: Any...) -> String {
    var concat = ""
    for arg in args {
       concat = "\(concat)\(arg)"
    }
    return concat
}

1
有趣的是,在你的代码中,你基本上暗示了Printable,而Any并不符合...但它仍然可以编译(但是对于不符合PrintableDebugPrintable的类型,字符串插值并没有返回任何特别有用的东西)。 - Thorsten Karrer
@ThorstenKarrer:确实很有趣。(虽然这里是偶然的,我只是想展示“Any”多元签名。你说得对,你不应该能够用它们做任何有用的事情。) - Amadan
@ThorstenKarrer:也许可能是这里引用的问题16562388(https://dev59.com/pl8e5IYBdhLWcg3wYJeu#25816505),在此记录(https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html)? - Amadan
似乎调试器将始终生成对象的字符串表示,而不管它是否符合 PrintablePrintable 允许您自定义该表示。不幸的是,后者在Playgrounds中仍然有问题,这就是您提到的问题。 - Thorsten Karrer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接