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

Swift简化UIView Outlet赋值闭包的实现方案咨询

简化UIView Outlet赋值的更优实现思路

我希望通过将Outlet变量传递给目标视图完成赋值,以此简化复杂UIView结构的创建。目前已有如下实现代码:

class ExampleController: UIViewController {

    @IBOutlet private(set) var stackView: UIStackView!
    @IBOutlet private(set) var titleLabel: UILabel!
    @IBOutlet private(set) var spacer: UIView!
    @IBOutlet private(set) var messageLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        UIStackView(outlet: { stackView = $0 }, arrangedSubviews: [
            UILabel().outlet { titleLabel = $0 },
            UIView().outlet { spacer = $0 },
            UILabel().outlet { messageLabel = $0 },
        ])
    }
}

extension UIView {
    @objc func outlet(_ outlet: (UIView) -> Void) -> UIView {
        outlet(self)
        return self
    }
}

extension UIStackView {

    @discardableResult
    convenience init(outlet: (UIStackView) -> Void, arrangedSubviews: [UIView]) {
        self.init()
        outlet(self)
        arrangedSubviews.forEach { addArrangedSubview($0) }
    }
}

extension UILabel {

    override func outlet(_ outlet: (UILabel) -> Void) -> UILabel {
        outlet(self)
        return self
    }
} 

我希望简化负责Outlet赋值的闭包写法,替代当前的UILabel().outlet { titleLabel = $0 },实现类似UILabel().outlet(titleLabel)或UILabel().outlet { titleLabel }的简洁写法。后续尝试了以下两种方案:


KeyPath方案

extension UILabel {

    func outlet<T: NSObject>(object: T, _ outletKeyPath: ReferenceWritableKeyPath<T, UILabel?>) -> UILabel {
        object[keyPath: outletKeyPath] = self
        return self
    }

}
    
UILabel().outlet(object: self, \.titleLabel)

Inout方案

extension UILabel {

    func outlet(_ outlet: inout UILabel?) -> UILabel {
        outlet = self
        return self
    }
    
}

UILabel().outlet(&titleLabel)

现咨询更优的实现思路。


内容的提问来源于stack exchange,提问作者Blazej SLEBODA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:40:34