swift - Swift:带有闭包和类型别名的函数语法
问题描述
我不明白这个代码片段末尾的函数循环的语法(来自我正在学习的课程)。成员是否充当 arrayClosure 使用的字符串数组的占位符?如果是这种情况,我可以看到 name 如何成为该数组中每个值的占位符。如果没有,我不知道最后如何阅读 activeMembers 的执行。
var partyMembers = ["Harrison", "Steven", "Bob the Noob"]
typealias AttackTuple = (name: String, damage: Int, rechargeable: Bool)
var sunStrike: AttackTuple = ("Rainbow Burst", 1000, false)
func levelUpAttack(baseAttack: AttackTuple) -> AttackTuple {
let increasedAttack: AttackTuple = (baseAttack.name, baseAttack.damage + 10, true)
return increasedAttack
}
var poweredAttack = levelUpAttack(baseAttack: sunStrike)
func activeMembers(completion: arrayClosure) {
completion(partyMembers)
}
//I don't understand what name is referencing here
activeMembers { (members) in
for name in members {
print("\(name) is active")
}
}
感谢您的见解,谢谢!
解决方案
这段代码:
activeMembers { (members) in
for name in members {
print("\(name) is active")
}
}
是对activeMembers
(completion:)` 的调用。完全脱糖后,它看起来像这样:
activeMembers(completion: { (members: [Member]) -> Void in
for name in members {
print("\(name) is active")
}
})
由于您没有给我们arrayClosure
typealias 的定义(应该像其他类型名称一样大写,顺便说一句,ArrayClosure
),我不得不假设它members
有 type [Member]
。
闭包(从 开始的代码{ }
)只是一个值,该值作为参数传递completion
给activeMembers
. 然后activeMembers
函数的实现是采用completion
闭包并调用它。它调用它,将partyMembers
值作为参数提供给它的唯一参数。
由于completion
指的是包含 for 循环的闭包,因此调用它将运行闭包内的代码。partyMembers
参数现在是参数的值,然后members
循环并打印。
您可以通过跟踪正在发生的事情来更好地理解这一点:
var partyMembers = ["Harrison", "Steven", "Bob the Noob"]
typealias Member = String
typealias arrayClosure = ([Member]) -> Void
func activeMembers(completion: arrayClosure) {
print("About to call completion")
print("The value of partyMembers is: \(partyMembers)")
completion(partyMembers)
print("About to return from activeMembers(completion:)")
}
print("1. About to create closure")
let closure: arrayClosure = { (members: [Member]) -> Void in
print("4. Entered closure, about to loop over the members.")
print("5. The value of the members parameter is: \(members)")
for name in members {
print("\(name) is active")
}
print("6. Finished looping")
print("7. About to return from the closure")
}
print("2. Closure created")
print("3. About to call activeMembers(completion:)")
activeMembers(completion: closure)
print("8. Finished call to activeMembers(completion:)")
推荐阅读
- asp.net - ASP.NET 表单的非空验证
- python - 脚本仅在我重新启动 shell 时才有效
- javascript - 本地存储变量 i 未定义
- r - 如何将数据框转换为 3-D 矩阵,其中两列数据框的值形成矩阵的列标题
- c# - 更新数量并将数组保存到文本文件
- javascript - Lambda 通过 While 循环多次调用 DynamoDB DocumentClient
- javascript - 根据d3.js中的多项选择更改圆圈的属性
- javascript - 在 if 条件内分配时限定变量的范围
- c# - 违反 PRIMARY KEY 限制 - EF
- c++ - c ++如何从const参数中获取值并将其分配给非常量变量