SwiftUI Swift 大白话讲知识点之 可变参数 variadic parameters 有什么用 ?

如果您要实现的函数或方法的参数可以接受零个或多个值,那么请考虑使用可变参数

在 Swift 中进行编码时,有一个函数无疑是所有开发人员都毫不犹豫地慷慨地调用的,那就是print. 我们每天都在任何地方使用它;大多数时候,这是我们通向快速和肮脏调试的途径。
尽管print似乎在 Swift 中最常用的命令中获胜,但您有没有想过它是如何让接受任意数量的参数成为可能的?更重要的是,你有没有想过实现我们自己的功能,就像print?
如果是这样,牛逼母鸡所有的答案是简单而有一个名称; 可变参数variadic parameters.

具有可变参数的函数

带有可变参数的函数是带有可以接受零、一个或多个相同类型参数的参数的函数。为了表明一个参数是可变参数,我们所要做的就是在参数的数据类型后附加三个点。
在函数体内使用可变参数的值也非常简单;我们把它当作一个数组。看看下面的例子,它展示了所有这些:

func createSentence(_ words: String...) -> String {
    words.joined(separator: " ")
}

createSentence(_:)是一个简单的函数,它使用给定的词作为参数创建一个句子。该句子可以是我们想要的短或长,其长度取决于提供的单词的数量。例如:

let sentence = createSentence("Variadic", "parameters", "in", "Swift!")
print(sentence)

// It prints:
// Variadic parameters in Swift!

下面的功能和上一个类似;唯一改变的是参数,这次是一个字符串值数组:

func createSentence(_ words: [String]) -> String {
    words.joined(separator: " ")
}

使用上述方法有两个不同之处,即始终与带有可变参数的第一个函数进行比较。第一个是关于我们将值传递给函数的方式;它必须是一个数组,与前面的示例相反,其中值仅用逗号符号分隔:

let anotherSentence = createSentence(["Hello", "Swift", "world!"])
print(anotherSentence)

// It prints:
// Hello Swift world!

已经提到了第二个区别;这是带有可变参数的函数可以接受零参数。以下是完全正确的,因为可变参数允许这样做:

let empty = createSentence()

empty在这种情况下将是一个空字符串。在第二个函数中,我们仍然可以避免提供任何值;然而,仍然必须传递一个空数组:

let anotherEmpty = createSentence([])

这是带有可变参数的函数的不同示例:

func averageTemperature(_ temperatures: Double...) -> Double {
    !temperatures.isEmpty ?
        temperatures.reduce(0, { $0 + $1 }) / Double(temperatures.count) :
        0
}

上面所做的是计算所有作为参数给出的平均温度。由于temperatures是一个可变参数,我们可以提供任意数量的温度值,甚至没有。在后一种情况下,返回值只是零:

var avg = averageTemperature(22.3, 25.4, 24, 26.2, 22.1)
print(avg)
// It prints:
// 24.0

avg = averageTemperature()
print(avg)
// It prints:
// 0.0

请注意,可变参数也可以与其他普通参数一起存在。例如,请参阅以下函数,该函数存储运动员在各种体育比赛中的得分;预计还将提供运动员的姓名:

struct Performance {
    var name: String
    var scores: [Double]
}

func keepPerformance(_ scores: Double, name: String) -> Performance {
    Performance(name: name, scores: [scores])
}

有多个可变参数

在 Swift 5.4 之前,一个函数只能包含一个可变参数。然而,这从 5.4 版开始发生了变化,函数可能有多个这样的参数。
只需要记住一个要求,这在前面的例子中就很明显了;可变参数后面的下一个参数应该有一个参数标签,所以编译器很清楚哪些参数被赋予了可变参数,哪些参数被赋予了下一个参数。
以下代码演示了一个包含三个可变参数的函数;请注意,普通参数也总是可以混入的:

func showGameInfo(_ players: String..., points: Int..., fouls: Int...) {
    for i in 0..<players.count {
        print("""
            Player \(players[i])
            scored \(i < points.count ? points[i] : 0) points
            and commited \(i < fouls.count ? fouls[i] : 0) fouls.
            """)
    }
}

showGameInfo("John", "Tom", "Max", "Ben", "Matt",
             points: 8, 4, 0, 4,
             fouls: 3, 2)

// It prints:
// Player John scored 8 points and commited 3 fouls.
// Player Tom scored 4 points and commited 2 fouls.
// Player Max scored 0 points and commited 0 fouls.
// Player Ben scored 4 points and commited 0 fouls.
// Player Matt scored 0 points and commited 0 fouls.

总结

可变参数是 Swift 中的一个简单主题,也是一个值得考虑的工具参数。如果您要实现的函数或方法的参数可以接受零个或多个值,那么请考虑使用可变参数;你最终会得到更具可读性和更清晰的代码,并且保留了数组处理的优势。


精品教程推荐


加入我们一起学习SwiftUI

QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com

发表回复