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
相关产品推荐
相关产品推荐

