Согласно Apple, Swift документации отложитьЯвляется ли «дефер» гарантированным называться в Swift?
Это утверждение позволяет сделать любую необходимую очистку, которые должны быть выполнены независимо от того, как выполнение покидает текущий блок коды оставляет ли это из-за ошибки были выброшены или из-за такой как возврат или разрыв.
Но этот код:
enum SomeError: ErrorType {
case BadLuck
}
func unluckey() throws {
print("\n\tunluckey() -> someone will have a bad day ;)\n")
throw SomeError.BadLuck
}
func callsUnluckey() throws {
print("callsUnluckey() -> OPENING something")
defer {
print("callsUnluckey() -> CLOSEING something")
}
print("callsUnluckey() -> WORKING with something")
try unluckey()
print("callsUnluckey() -> will never get here so chill...")
defer {
print("callsUnluckey() -> why this is not getting called?")
}
}
do {
try callsUnluckey()
} catch {
print("")
print("someone had a bad day")
}
Производит этот результат в консоли:
callsUnluckey() -> OPENING something
callsUnluckey() -> WORKING with something
unluckey() -> someone will have a bad day ;)
callsUnluckey() -> CLOSEING something
someone had a bad day
И мой вопрос: почему последний Перенести в callsUnluckey() не называется?.
Программа должна на самом деле дозвониться до отложенного вызова для внутреннего блока, чтобы запланировать его. – dan
Можете ли вы указать мне любую документацию об этом? :) Или любая информация о том, как эти блоки планируются? – sloik
Я сомневаюсь, что это будет документировано, вот как работают программы. – dan