首页 > 解决方案 > 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")
    }
}

感谢您的见解,谢谢!

标签: swiftclosurestype-alias

解决方案


这段代码:

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")
    }
})

由于您没有给我们arrayClosuretypealias 的定义(应该像其他类型名称一样大写,顺便说一句,ArrayClosure),我不得不假设它members有 type [Member]

闭包(从 开始的代码{ })只是一个值,该值作为参数传递completionactiveMembers. 然后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:)")

推荐阅读