繁体   English   中英

Swift:带有闭包和类型别名的函数语法

[英]Swift: Function syntax with closure and type alias

我不了解此代码片段末尾的函数循环的语法(来自我正在学习的课程)。 成员是否充当 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类型别名的定义(它应该像其他类型名称一样大写,顺便说一句, ArrayClosure ),我不得不假设members具有[Member]类型。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM