В качестве альтернативы, если вы хотите иметь действительно гибкий способ, вы можете использовать концепцию стилей представления.Вот простая реализация, с которой вы могли бы начать:
typealias Style<T> = (T) -> Void
extension UIView {
convenience init<V: UIView>(with styles: [Style<V>]) {
self.init(frame: .zero)
guard let view = self as? V else {
assertionFailure("Could not apply style for \(V.self) to \(type(of: self))")
return
}
styles.forEach { $0(view) }
}
}
, затем объявить некоторую таблицу стилей
enum ViewStyle {
static func rounded(radius: CGFloat) -> Style<UIView> {
return { view in
view.layer.cornerRadius = radius
view.clipsToBounds = true
}
}
static let lightGray: Style<UIView> = { view in
view.backgroundColor = .lightGray
}
}
и использовать ее как
let button = UIButton(with: [ViewStyle.rounded(radius: 5.0)])
let textField = UITextField(with: [
ViewStyle.rounded(radius: 8.0),
ViewStyle.lightGray
])
Это позволит вамповторно использовать предопределенные стили и смешивать их для достижения более сложных настроек без создания собственных пользовательских подклассов.И, конечно, это всего лишь маленький тизер того, что можно сделать, я призываю вас пойти глубже:)