Swift lazy Loading (lazy) in programming, we often use
* Lazy Loading *, as the name implies, is used to open up space, such as the most commonly used controls in iOS development
UITableView,When we implement the data source method, we usually write like this objective-c
1 //data Source proxy methods that must be implemented2-(Nsinteger) TableView: (UITableView *) TableView numberofrowsinsection: (nsinteger) section3 {4 returnSelf.dataArray.count;5 }6 7-(UITableViewCell *) TableView: (UITableView *) TableView Cellforrowatindexpath: (Nsindexpath *) Indexpath8 {9 //1. Get the cellTenXwshopcell *cell =[Xwshopcell Cellwithtableview:tableview]; One A //2. Transfer Model -Cell.wine =Self.dataarray[indexpath.row]; - the //3. Callback Cell - returncell; -}
In the code above,
1return self.dataArray.count;
is actually using
1 @property (nonatomic, strong) Nsarray *dataarray;
@property attribute, a get and set method is generated for the property, and here is the Get method of the call, but return self.dataArray.count in the preceding code calls
-(Nsarray *) dataarray{ return _dataarray}
This call, if the member property DataArray Start No assignment, then in use, call get method, do not rewrite, will error, null pointer, so generally we will rewrite the Get method
1 // overriding the Get method 2 -(Nsarray *) DataArray3{4 if (nil = = _dataarray) { 5 _dataarray = [Nsarray array]; 6 }7 return _dataarray8 }
This prevents the member property from being assigned
- In summary, objective-c lazy loading, is actually called the member property of the Get method, initialize the value, and swift lazy load, is and objective-c different
Swift
1 //MARK Tablview's DataSource proxy method2Func TableView (Tableview:uitableview, numberofrowsinsection section:int)int{3 returnSelf.dataArray.count4 }5 6Func TableView (Tableview:uitableview, Cellforrowatindexpath Indexpath:nsindexpath)uitableviewcell{7 //1. Get the cell8Let cell =Xwshopcell.cellwithtableview (TableView)9 Ten //2. Transfer Model OneCell.wine =Self.dataarray[indexpath.row] A - //3. Callback Cell - returnCell the}
1 return self.dataArray.count
- In the Swift storage property must initialize, confirm the type, or use optional type, in short to confirm the type, after all, Swfit is a type-safe language, so Swift proposes the lazy attribute, the usage
1 // 1. Analysis Nsarray is a closure of the return value, and this is a closed packet without parameters 2 Lazy var Dataarray:nsarray = {3 return []4 } () 5 6 // 2. It can also be written like this 7 Lazy var Dataarray:nsarray = {8 return nsarray ()9 }()
1 //3. Loading from the plist file2Lazy var dataarray:array<xwwine> = {3Let Winepath = Nsbundle.mainbundle (). Pathforresource ("wine.plist", Oftype:nil)!4 5Let Winesm =Nsmutablearray (contentsoffile:winepath);6 7var tmparray:array<xwwine>! = []8 9 forTmpwinedictinchwinesm! {Ten Onevar wine:xwwine = xwwine.winewithdict (tmpwinedict as!nsdictionary) A - tmparray.append (wine) - } the -Print"I run it one time") - - returnTmparray +}()
The above code, a bit difficult to understand, if before will objective-c block or the C language function pointer understand thoroughly, can be regarded as a block of code, and then Self.dataarray, then executes the code block, but repeated calls, the Lazy property of the code block will only called once , the lazy decoration is a storage property, and the store is a closure, I think inside, should be optimized
Personal humble opinion, there is a static storage space inside, when the space is not value, will execute the closure code, return value, will be placed in this storage space, a bit like the objective-c of the singleton object.
- Welcome reprint, but please keep the original address Boyxiong (great god: Majestic)
IOS Development--Practical technology Swift article &swift lazy loading (lazy)