Swift: синтаксис функции с закрытием и псевдонимом типа - PullRequest
0 голосов
/ 17 января 2020

Я не понимаю синтаксис l oop через функцию в конце этого фрагмента кода (из курса, который я беру). Являются ли члены в качестве заполнителя для массива строк, который использует 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")
    }
}

Проницательность, спасибо!

1 Ответ

1 голос
/ 17 января 2020

Этот код:

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:)")
...