首页 > 解决方案 > 如果我们可以简单地调用它来实现,为什么要将函数作为参数传递给其他函数?

问题描述

我无法理解添加此功能的原因。

将作为参数传递或由另一个方法调用的方法

func add(_ a : Int, _ b : Int) -> Int {
    return a + b 
}

从其他函数调用函数时

func average(_ a : Int, _ b : Int) -> Int{
    return add(a, b) / 2
}

将函数作为参数传递给其他函数时

func averageArg(_ plus: (Int, Int) -> Int, _ a: Int, _ b : Int) -> Int {
    return plus(a, b) / 2
}

标签: swiftfunctionmethods

解决方案


将函数作为参数的原因是它使您的函数更加灵活。它让调用者plus通过传递组合两个Int值以返回值的函数或闭包来决定做什么Int

例如,假设调用者想要plus将值相乘:

print(averageArg(*, 5, 6))
15

或取max两个值中的一个(通过传递闭包):

print(averageArg({ max($0, $1) }, 1, 100))
50

一个更好的例子是 Swift 函数sorted(by:)sorted接受一个决定什么areInIncreasingOrder意思的闭包。这允许您通过更改传递的函数来按升序和降序对数组进行排序:

[1, 3, 2, 4].sorted(by: <)
[1, 2, 3, 4]
[1, 3, 2, 4].sorted(by: >)
[4, 3, 2, 1]

这是一个使用函数的示例:

func shortNamesFirst(_ name1: String, _ name2: String) -> Bool {
    if name1.count < name2.count {
        return true
    } else if name1.count > name2.count {
        return false
    } else {
        // when names are the same length, sort
        // them alphabetically
        return name1 < name2
    }
}

["Chuck", "Bob", "Bill", "Jo", "Ed", "Alexander"].sorted(by: shortNamesFirst)
["Ed", "Jo", "Bob", "Bill", "Chuck", "Alexander"]

作者sorted不必为sorted用户可能想要的每种类型的订购提供不同的版本。用户可以决定sorted对他们意味着什么。


推荐阅读