One of the common UIKit pattern is to initialize and configure controls in this way:

class MainViewController: UIViewController {
    private let myButton: UIButton = {
        let x = UIButton()
        x.setImage(..., for: [])
        x.addTarget(self, action: #selector(foo(_:)), for: .touchUpInside)
        return x

I have been using that a lot because it contains all the configurations in 1 place.

But starting from Swift 5.6, there will be a warning.

‘self’ refers to the method MainViewController.self, which may be unexpected

If you auto fix for this case, then the app will crash.

We do really want to refer self to the instance of the view controller.


The easy fix is to change the let declaration to lazy var!

private lazy var myButton: UIButton = ...

That will remove the warning.

Don’t ask me why self is different between a lazy var and a let..




Back to Home