簡體   English   中英

在init的閉包內部創建的地址實例

[英]Adressing instance created inside closure in init

我有一個ControlPanel類,需要在初始化期間對其UI元素進行一些調整。 我想將這些調整作為init()的閉包進行傳遞。 但是我該如何正確地引用self呢? 這樣做時...

let cornerRadius = ControlPanel(title: "Corner Radius",
                                        layout: .oneSlider,
                                        sliderRange: (0.0, 30.0),
                                        setup: { self.someProperty = 5 }
        )

...迅捷當然假設self是指我在其中調用此初始化程序的類。 這完全無關。 是否有類似theSelfWhenThisClosureIsBeingExecuted語法?

我的ControlPanel初始化定義如下:

init(title: String, layout: PanelControlLayoutType, sliderRange: (min: Float, max: Float), editClosure1of1: ((Float) -> ())?, setup: () -> ()) {
    super.init(frame: CGRect())
    commonInit(title: title)
    guard layout == .oneSlider else { fatalError("Wrong paneltype") }
    let singleSlider = UISlider()
    slider1?[0] = singleSlider
    singleSlider.minimumValue = sliderRange.min
    singleSlider.maximumValue = sliderRange.max
    self.addSubview(singleSlider)
    self.editClosure1of1 = editClosure1of1
    singleSlider.translatesAutoresizingMaskIntoConstraints = false
    singleSlider.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 50.0).isActive = true
    singleSlider.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -50.0).isActive = true
    singleSlider.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -32.0).isActive = true
    singleSlider.tag = 0
    singleSlider.addTarget(self, action: #selector(self.sliderChanged(_:withEvent:)), for: .valueChanged)
}

您可以將setup聲明為一個閉包,它使用剛創建的實例作為參數。 例:

class ControlPanel: UIView {

    let title: String
    var someProperty: Int = 0

    init(title: String, setup: ((ControlPanel) -> Void)? = nil) {
        self.title = title
        super.init(frame: CGRect())

        if let setup = setup {
            setup(self)
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

這可以稱為

let panel = ControlPanel(title: "title") {
    $0.someProperty = 5
}

但是,只有在實例完全初始化后才能調用閉包,這意味着someProperty需要是一個變量,並且必須分配一個初始值。 因此,創建實例后進行自定義設置沒有太多優勢:

let panel = ControlPanel(title: "title")
panel.someProperty = 5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM