How to properly implement a lazy instance using the @IBOutlet property in Swift

I am learning iOS development with the Big iOS Book by Big Nerd Ranch. I decided to implement my applications in Swift. In one of their applications, they have the following code in Objective-C:

- (UIView *)headerView
{
    // If you have not loaded the header view yet...
    if (!_headerView) {

        // Load HeaderView.xib
        [[NSBundle mainBundle] loadNibNamed:@"HeaderView" owner:self options:nil]
    }

    return _headerView;
}

Apple Swift Guide to "@IBOutlet":

When you declare an exit in Swift, the compiler automatically converts this type to a weak implicitly expanded optional and sets it to the initial value nil. In fact, the compiler replaces the name @IBOutlet var: Type with @IBOutlet weak var name: Type! = Nil.

Lazy loading Properties swift, . @IBOutlet, , .

№ 1 (): , AppDelegate.swift. , "IBOutlet" , "

@IBOutlet var headerView : UIView  {
    // If the HeaderView has not been loaded yet...
    if !_headerView {
        // Load HeaderView.xib
        NSBundle.mainBundle().loadNibNamed("HeaderView", owner: self, options: nil)
    }
        return _headerView!
}
var _headerView : UIView? = nil

№ 2 (): "@lazy" "@IBOutlet" , "@lazy" , , "@IBOutlet" , # 1

№ 3 (?): , . : Lazy Swift. , , - , "@IBOutlet var headerView: UIView!= Nil", TableViewController, , "", TableViewController.

@IBOutlet var headerView : UIView

func loadHeaderView() {
    // If the HeaderView has not been loaded yet...
    if !headerView {
        // Load HeaderView.xib
        println("loaded HeaderView")
        NSBundle.mainBundle().loadNibNamed("HeaderView", owner: self, options: nil)
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    loadHeaderView()
    tableView.tableHeaderView = headerView
}

, ?

viewDidLoad() ?

+4
4

headerView , . @IBOutlet , XIB/Storyboard , , , :

@IBOutlet var headerView : UIView {
get {
    if !_headerView {
        NSBundle.mainBundle().loadNibNamed("HeaderView", owner: self, options: nil)
    }
    return _headerView!
}
set {
    _headerView = newValue
}
}
var _headerView : UIView? = nil
+5

- , , . , , @lazy.

+5

...

@IBOutlet lazy var headerView : UIView? = {
    return NSBundle.mainBundle().loadNibNamed("HeaderView", owner: self, options: nil)[0] as? UIView
    }()

headerView

override func viewDidLoad() {
  super.viewDidLoad()
  tableView.tableHeaderView = headerView
}
+4

didSet:

 @IBOutlet weak var profileImageView: UIImageView! {
        didSet {
            profileImageView.image = profileImage
            profileImageView.layer.masksToBounds = true
            profileImageView.layer.cornerRadius = 16
        }
    }
0

Source: https://habr.com/ru/post/1545155/


All Articles