Swift 4无Storyboard构建UI:闭包方式是否为常规做法?
关于纯代码构建UI的两种写法:闭包初始化 vs 声明+配置函数
嘿,很高兴你开始转向纯代码搭建UI——这绝对是个能让你对界面布局拥有更精细掌控的好选择!针对你的两个问题,我来逐一解答:
1. 用闭包创建UI元素是常规方式吗?
当然是!这种写法叫做立即执行闭包(Immediately Invoked Closure),是iOS纯代码UI开发里非常流行且推荐的实践方式。它的核心优势在于:
- 把UI元素的声明、初始化、配置全部集中在同一个地方,不用分散到变量声明区和
viewDidLoad里,代码结构更紧凑; - 保证变量初始化完成后就处于配置好的状态,避免出现“忘记调用配置函数导致UI显示异常”的情况;
- 对于简单的UI元素,能让代码可读性更高,一眼就能看到这个元素的所有属性设置。
举个典型的闭包初始化例子:
let titleLabel: UILabel = { let label = UILabel() label.text = "我的标题" label.textColor = .darkGray label.font = .systemFont(ofSize: 18, weight: .semibold) label.translatesAutoresizingMaskIntoConstraints = false // 纯代码AutoLayout必备 return label }()
2. 你原来的“声明变量+配置函数+viewDidLoad调用”的写法有误吗?
完全没有问题!这也是一种非常合理且常用的代码组织方式,尤其适合以下场景:
- UI元素的配置逻辑比较复杂,拆分到单独的函数里能让代码更清晰;
- 多个UI元素需要复用相同的配置逻辑(比如多个Label需要统一的字体、颜色),抽成通用配置函数可以减少重复代码;
- 你个人习惯把“变量声明”和“逻辑配置”分开管理,让
viewDidLoad里的布局代码更聚焦。
比如你的写法示例:
// 声明变量 let titleLabel = UILabel() let subtitleLabel = UILabel() override func viewDidLoad() { super.viewDidLoad() configureUIElements() setupLayout() } // 统一配置UI元素 private func configureUIElements() { configureTitleLabel() configureSubtitleLabel() } private func configureTitleLabel() { titleLabel.text = "我的标题" titleLabel.textColor = .darkGray titleLabel.font = .systemFont(ofSize: 18, weight: .semibold) titleLabel.translatesAutoresizingMaskIntoConstraints = false } private func configureSubtitleLabel() { subtitleLabel.text = "我的副标题" subtitleLabel.textColor = .lightGray subtitleLabel.font = .systemFont(ofSize: 14) subtitleLabel.translatesAutoresizingMaskIntoConstraints = false } // 单独处理布局 private func setupLayout() { view.addSubview(titleLabel) view.addSubview(subtitleLabel) NSLayoutConstraint.activate([ titleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20), titleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16), subtitleLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 8), subtitleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16) ]) }
总结:两种方式怎么选?
没有绝对的优劣,完全看你的场景和个人习惯:
- 简单UI元素,优先用闭包初始化,代码更紧凑;
- 复杂/可复用的配置逻辑,用“声明+配置函数”的方式,代码更易维护。
不管用哪种方式,记得一定要设置translatesAutoresizingMaskIntoConstraints = false——这是纯代码使用AutoLayout的必要前提哦!
内容的提问来源于stack exchange,提问作者Unknown_
相关产品推荐
相关产品推荐

