Следует ли мне избегать папки констант в Swift

#swift

Вопрос:

У меня есть viewcontroller и постоянное свойство, как показано ниже. Я хочу снова использовать tableViewRowHeight в своем vc, чтобы избежать использования подобных tableView.tableViewEsmimatedRowHeight = 100

 final class ViewController: UIViewController {

   // MARK: - Constants
    private struct Constants {
        static let tableViewRowHeight: CGFloat = 100
    }

}
 

или

Я должен создать групповую папку с именем константа ? Какое решение является лучшим с точки зрения безопасности и очистки моего ВК в противном случае оптимальным способом ?

Комментарии:

1. Если у вас много констант, лучше создать отдельное имя файла как константы.swift . Там вы могли бы написать структуру для различных типов констант. затем вызовите, используя константы.structName. Собственность. Это повысит читаемость кода

2. @alamin39 это не повысит читаемость кода. Всегда ставьте константы там, где им место.

Ответ №1:

Учитывая ваш пример, подход был бы:

 class ViewController: UIViewController {
    let tableViewRowHeight: CGFloat = 100
}
 

или

 class ViewController: UIViewController {
    var tableViewRowHeight: CGFloat { 100 }
}
 

И то и другое прекрасно.

Нет причин выделять это как тип «Констант». Нет необходимости делать его статичным.

Высота строки зависит от представления таблицы. Это не похоже на то, что при изменении высоты строки одной таблицы вы захотите изменить все таблицы в своей программе. Так что вы бы не хотели ни во что это втягивать. Можно назвать его и поместить в раздел вашего конкретного ViewController, чтобы вы могли легко его найти, но создание типа под названием «Константы» ничего не даст.

Что, если бы вы все же захотели изменить некоторые аспекты во всей вашей системе? Возможно, основной шрифт или цвет подсветки, который, если вы измените для одного вида, вы хотите изменить для всех видов. Тогда было бы разумно иметь для этого тип. Но это все равно не было бы каким-то расплывчатым названием вроде «Константы». В большинстве случаев на самом деле лучше всего сделать это, добавив расширения на то, что вы хотите:

 extension UIColor {
    static var corporateHighlight: UIColor { .green }
}
 

Это означает, что когда вы используете его, вы можете просто позвонить ему .corporateHighlight . Тем не менее, я настоятельно рекомендую вам вместо этого посмотреть каталоги активов.

По моему опыту, редко бывает, что расстояние или высота имеют смысл делать таким образом. Но если они это делают, часто имеет больше смысла создавать подкласс UITableView, который переопределяет rowHeight , а не где-то для него константу. Таким образом, вы можете назвать UITableView, чтобы указать, как эти таблицы «одинаковы» в некотором роде. (Опять же, не имеет смысла устанавливать высоту одной строки для каждой таблицы в программе.)

Мне также иногда нравится решение Висала Раджапаксе поместить эту информацию в ячейку, а не в таблицу. Иногда это срабатывает, иногда нет. Но он отражает ту же идею наличия типа, представляющего ячейки, которые имеют что-то общее и должны отличаться друг от друга.

У вас никогда не должно быть глобальной вещи, называемой «Константами». Это слишком широко и нарушает повторное использование кода. Даже если бы вам в конечном итоге понадобилось что-то, чтобы сохранить ценности, вы бы хотели придать этому что-то вроде стиля. Наличие одного места, в котором вы перечисляете все ячейки, а также все значения тайм-аута сети, а также количество попыток повторения пароля, — это просто свалка случайных глобальных значений. Редко бывает так, что вы хотите поместить константы вне того типа, в котором они чаще всего используются. Еще реже вы хотите, чтобы они были глобальными в таком масштабе.

Ответ №2:

Просмотры таблиц

Вы можете создать подкласс UITableViewCell . Например,

 class RootTableViewCell: UITableViewCell {
    // Get only height property
    static var height: CGFloat {
        return 100
    }
}
 

И наследовать от RootTableViewCell до ячеек, высота которых вам нужна 100, следующим образом

 class CustomCell: RootTableViewCell {
   
}
 

Который сделает height доступными все ячейки, из которых происходит подкласс RootTableViewCell .

Константы для общего пользования

Если вы используете height = 100 «где-то еще», лучшим вариантом является создание Constants класса и вложенность structs для каждой функции, которую вы хотите. Например,

 struct Constant {
    struct Cells {
        static let height: CGFloat = 100
    }
}
 

Использование этого будет,

 cell.frame.size.height = Constant.Cells.height
 

Использование генератора кода

Последний вариант — использовать генератор кода. Популярным вариантом является SwiftGen, который значительно упрощает работу, если вы настроили его для своего проекта. Он автоматически сгенерирует все константы, такие как UIImages , UIColor , наконечники и т.д. для тебя

Комментарии:

1. кстати, удобный способ обертывания констант-это пустой enum , а не a struct . Я бы посоветовал никогда не вызывать что-то Constants , всегда есть лучшее место для размещения константы вместо какого-то общего файла с именем Constants . Это не лучший вариант, это всегда неправильный вариант. Я не могу больше согласиться с постоянной высотой, помещенной в определенную ячейку, хотя в большинстве ситуаций высота должна быть объявлена в xib.