Напомним, что метод Array
first
возвращает необязательный параметр.Следующее предупреждение дает предупреждение о том, что оно неявно приводило к необязательности, поэтому, предположительно, это плохая практика:
let names = ["Bob", "Alice"]
let x = names.first
print(x)
// Warning: Expression implicitly coerced from 'String?' to 'Any'
Однако упрощение примера в документации Apple Swift для замыканий делаетвнешне эквивалентная вещь, и не вызывает никаких предупреждений.
var closures: [() -> Void] = []
closures.append {print("Hello from the first closure in the list!")}
closures.append {print("Hello from the second closure in the list!")}
// Implicitly coerce the closure
closures.first?()
// Printed: Hello from the first closure in the list!
Разве это не "одно и то же", за исключением того факта, что один является необязательной строкой, а другой - необязательным закрытием?Поскольку он находится в официальных документах Swift и не вызывает каких-либо ошибок, я уверен, что это нормальное использование.Чего мне не хватает?
Редактировать: Спасибо за ответы!Я думаю, я понял это сейчас.Пример, подобный первому, будет больше похож на:
var closures: [() -> String] = []
closures.append {"Hello from the first closure in the list!"}
print(closures.first?())
, который действительно выдает то же самое предупреждение, потому что необязательное сцепление возвращает необязательное, даже если закрытие не выполняется.