You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:37:33