Кроме меток, используемых для прерывания циклов ( изменение потока управления ), в вашем конкретном примере это, вероятно, используется для организации кода.
Итак, в:
UI: do {
//...
}
UI:
- это помеченный оператор , где UI
- это определенное пользователем имя метки, которое должно быть достаточно описательным, чтобы указывать или подсказывать читателю его назначение
Помеченный оператор
Вы можете добавить префикс цикла, оператора if, оператора switch или оператора do к метке оператора, состоящей изза именем метки сразу следует двоеточие (:).Используйте операторные метки с оператором break и continue для явного указания того, как вы хотите изменить поток управления в операторе цикла или операторе switch
Ref: https://docs.swift.org/swift-book/ReferenceManual/Statements.html#ID439
do { }
- это оператор Do
Оператор Do
Оператор do используется для введенияновая область и может дополнительно содержать одно или несколько предложений catch, которые содержат шаблоны, соответствующие определенным условиям ошибки.Переменные и константы, объявленные в области действия оператора do, могут быть доступны только в этой области.
Ref: https://docs.swift.org/swift-book/ReferenceManual/Statements.html#ID533
//...
- это весь код в пределах do
Пример использования:
В монолитной функции для улучшения читабельности кода и разделенияДля внутренней логики можно использовать помеченный оператор do.
Итак, если это монолитная функция:
func update() {
var hasUpdatedDatasource = false
print("setting datasource")
//N lines of code related to datasource
let strings = ["update", "Datasource"]
print(strings.joined())
hasUpdatedDatasource = strings.count > 2
print("setting something")
//N lines of code related to something
if hasUpdatedDatasource {
print("setting some more stuff")
//N lines of code related to something more
}
print("setting UI")
//N lines of code related to UI
}
Здесь мы видим несколько строк кода, в которых вы можете создавать / изменятьпеременные.В основном много суперпрограммы, из-за которой трудно определить, какой набор строк кода обрабатывает какую функцию или часть функции.
Использование помеченного оператора do, как в вашем случае, сделает коднемного более читабельно, например, так:
func update() {
var hasUpdatedDatasource = false
updateDatasource: do {
//do datasource related modification
//N lines of code go here
let datasource = ["update", "Datasource"]
print(datasource.joined())
hasUpdatedDatasource = strings.count > 2
}
doSomething: do {
print("doSomething")
//N lines of code go here
guard hasUpdatedDatasource else { break doSomething }
print("doSomething: More")
//N lines of code go here
}
updateUI: do {
print("updateUI")
//N lines of code go here
}
}
Это позволяет вам превращать набор строк кода в блок кодов с именем описательной метки и более четко отображать логический поток.
Вы можете получить доступ и изменитьПеременные сверху это do
область видимости, и поскольку она имеет свою собственную область видимости, переменные, созданные внутри, доступны только здесь.
Это может предотвратить ненужную задержку переменных до конца функции.
ПРИМЕЧАНИЯ:
updateDatasource
создал локальную переменную datasource
, которая не будет доступна вне ее области действия, И ... изменил переменную hasUpdatedDatasource
, которая является локальной для всей функции doSomething
имеет оператор break, который может в любой момент разбить себя, ссылаясь на имя метки
Это делает код более реadable, но не обязательно более удобен в обслуживании, поскольку это statefull.
Лично я предпочитаю разбивать большие функции на меньшие или вложенные функции.Но это не значит, что помеченные операторы do не имеют своего места.
Если это делает ваш код лучше, сделайте это.