swift - 如果我们可以简单地调用它来实现,为什么要将函数作为参数传递给其他函数?
问题描述
我无法理解添加此功能的原因。
将作为参数传递或由另一个方法调用的方法
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
}
解决方案
将函数作为参数的原因是它使您的函数更加灵活。它让调用者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
对他们意味着什么。
推荐阅读
- flutter - 如何在 Flutter 中向 TabBar 动态添加选项卡?
- amazon-web-services - 为什么 AppSync 解析器响应模板在调试显示结果时返回 null?
- javascript - 如何使用 Google App Scripts 从数据透视表中将明细表附加为 pdf 或 excel?
- javascript - 如何根据动态键制作Javascript过滤器值
- multithreading - 在应用程序中有两个 QThreadPool
- typescript - 如何删除 TypeScript 或 Flow 中未定义的继承类型的联合类型细化
- html - Font Awesome 图标与 Bulma 菜单中的文本不对齐
- keyboard-shortcuts - Atom 编辑器中的快捷方式移动到 Mac 中的上一个屏幕
- html - 当标题浮动时如何将标题和段落放在单独的行中?
- arrays - julia 函数从元组数组中选择一个元组