Этот код:
activeMembers { (members) in
for name in members {
print("\(name) is active")
}
}
является вызовом activeMembers
(завершение:) `. Когда полностью обессахарено, это выглядит так:
activeMembers(completion: { (members: [Member]) -> Void in
for name in members {
print("\(name) is active")
}
})
Поскольку вы не дали нам определение arrayClosure
typealias (которое должно быть написано с заглавной буквы, как и имена других типов, кстати, ArrayClosure
), Я должен был предположить, что members
имеет тип [Member]
.
Закрытие (код, начинающийся с { }
) - это просто значение, и это значение передается в качестве аргумента completion
параметр activeMembers
. Внедрение функции activeMembers
затем берет закрытие completion
и вызывает его. Он вызывает его, передавая значение partyMembers
в качестве аргумента своему единственному параметру.
Поскольку completion
ссылается на ваше закрытие, содержащее for-l oop, вызов его запустит код внутри вашего закрытие. Аргумент 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:)")