用更少的半样板来设置一个UIView(或对象)的多个属性



假设我正在设置一个UIStackView的属性。我将这样做:

let stackView = UIStackView()
stackView.distribution = .fill
stackView.alignment = .fill
stackView.axis = .vertical
stackView.spacing = 12

每次我写stackView,腕管综合征的影响都会加重。我可以做一个包含这些属性的扩展,但这对很多视图来说很难做到,你不能把所有属性都放到某个扩展中,这很糟糕。我已经看到了类似的东西,我会把下面的一些其他语言,我想知道如果我们心爱的Swift提供任何。我找了,但什么也没找到。任何想法吗?:

let stackView = UIStackView() {
distribution = .fill
alignment = .fill
axis = .vertical
spacing = 12
}

p。S:我可以这样做(当然也可以让它通用),但是额外的0美元还是让我很烦。

extension UIStackView {
convenience init(quickSetProperties: (UIStackView) -> Void) {
quickSetProperties(self)
}
}
let stackView = UIStackView() {
$0.distribution = .fill
$0.distribution = .fill
$0.alignment = .fill
$0.axis = .vertical
$0.spacing = 12
}

可惜Swift闭包不支持这一点。在您的情况下,您必须使用$0或在闭包中显式定义变量{ stackView in ... }来修改底层视图。

Tomas已经说过Swift闭包不支持

另一种方法是使用默认值的类方法,例如
extension UIStackView {
static func createCustom(distribution : UIStackView.Distribution = .fill,
alignment : UIStackView.Alignment = .fill,
axis : NSLayoutConstraint.Axis = .vertical,
spacing : CGFloat = 12.0) -> UIStackView {

let stackView = UIStackView()
stackView.distribution = distribution
stackView.alignment = alignment
stackView.axis = axis
stackView.spacing = spacing
return stackView
}
}

所以要用默认值创建一个新的stackview,但是使用不同的axis,只需写入

let s = UIStackView.createCustom(axis: .horizontal)

最新更新