Пользовательский интерфейс: сделать {} в Swift - PullRequest
1 голос
/ 22 марта 2019

В чем причина упаковки всего этого кода в блок UI: do { } и где я могу получить четкие инструкции по этому поводу?

UI: do {
    backgroundButton.setImage(UIImage.init(named: "search"), for: .normal)
    backgroundButton.backgroundColor = Colors.backgroundButtonBackgroundColor
    backgroundButton.tintColor = Colors.backgroundButtonTintColor
}

Ответы [ 3 ]

3 голосов
/ 22 марта 2019

Это помеченный оператор :

Помеченный оператор указывается путем размещения метки в той же строке, что и ключевое слово вводного оператора оператора, за которым следует двоеточие.

и его можно использовать, чтобы оторваться от посторонних прицелов.Наглядный пример приведен здесь .

1 голос
/ 22 марта 2019

Кроме меток, используемых для прерывания циклов ( изменение потока управления ), в вашем конкретном примере это, вероятно, используется для организации кода.

Итак, в:

UI: do {
    //...
}
  1. UI: - это помеченный оператор , где UI - это определенное пользователем имя метки, которое должно быть достаточно описательным, чтобы указывать или подсказывать читателю его назначение

    Помеченный оператор

    Вы можете добавить префикс цикла, оператора if, оператора switch или оператора do к метке оператора, состоящей изза именем метки сразу следует двоеточие (:).Используйте операторные метки с оператором break и continue для явного указания того, как вы хотите изменить поток управления в операторе цикла или операторе switch

    Ref: https://docs.swift.org/swift-book/ReferenceManual/Statements.html#ID439

  2. do { } - это оператор Do

    Оператор Do

    Оператор do используется для введенияновая область и может дополнительно содержать одно или несколько предложений catch, которые содержат шаблоны, соответствующие определенным условиям ошибки.Переменные и константы, объявленные в области действия оператора do, могут быть доступны только в этой области.

    Ref: https://docs.swift.org/swift-book/ReferenceManual/Statements.html#ID533

  3. //... - это весь код в пределах 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 не имеют своего места.
Если это делает ваш код лучше, сделайте это.

0 голосов
/ 22 марта 2019

UI в вашем коде - это помеченный оператор , который полезен в тех случаях, когда вы хотите выйти из внешней области (или блока), находясь внутри внутренней области (или блок)

Рассмотрим пример, в котором вы хотите выйти из внешнего цикла , когда возникает определенное условие, пока вы находитесь внутри другого цикла (или, innerLoop в нашем случае)

outerLoop: for outerCount in 1...5 {

    innerLoop: for innerCount in 1...5 {

        // Condition for breaking out of outer loop 
        if outerCount == 3 {
            break outerLoop
        }
        print("Outer Count: \(outerCount) Inner Count: \(innerCount)")
    }
}

Если бы мы использовали break вместо break outerLoop в вышеприведенном случае, мы будет просто в состоянии сломать innerLoop и все равно будет внутри externalLoop scope

Предложение do в вашем случае, как предположил @Rob, также можно использовать для простой инкапсуляции серии операторов в пределах их собственной области действия . То, что он делает, это обеспечивает область действия для некоторых переменных, которые инициализируются внутри do и будут освобождены, как только область действия do закончится

Рассмотрим следующий случай для do области видимости, которая автоматически деиницирует объект, как только область действия do заканчивается

class Demo {
    init() {
        print("Instance initialised")
    }

    deinit {
        print("Instance Deinitalised")
    }
}

do {
    let demoObject = Demo()
}

Вывод вышеуказанного кода будет

Экземпляр инициализирован

Экземпляр Deinitalised

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...