Swift的惰性初始化方法
一直喜歡使用Objective C
的惰性初始化, 這樣的程式碼結構會非常清晰和易維護.
@property (nonatomic, strong) NSMutableArray *players;
- (NSMutableArray *)players {
if (!_players) {
_players = [[NSMutableArray alloc] init];
}
return _players;
}
當你程式碼裡面呼叫NSArray *xx = self.players
時候就會點用這個getter的方法.
使用Swift
之後, 我第一個想法就是使用get 和 set 方法去實現惰性初始化, 想法很傻很天真. 下面的程式碼肯定會Crash.
Swift
不允許 Objective C
的下劃線訪問實體變數. 也就是說你只能用self.xxx
這樣去訪問變數. 這樣下面的程式碼在self.locationButton
就無限的自己呼叫自己.
var locationButton: UIButton! {
get {
if self.locationButton == nil {
var button = UIButton()
return button
}
return self.locationButton
}
}
優雅的實現: 惰性初始化
實現方式:1
Swift
提供了一個lazy
的修飾詞, 使用格式 lazy var variable: Class = { //初始化方法 return }()
這樣就會完成惰性初始化. 不需要再像Objective C
一樣去判斷實體變數是否為nil
.
lazy var mapView: MAMapView! = {
var mapView = MAMapView(frame: CGRectMake(0, 0, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame)))
mapView.delegate = self
mapView.compassOrigin.y = 24
mapView.scaleOrigin.y = 24
mapView.showsUserLocation = true
return mapView
}()
實現方式:2
使用func
去完成惰性初始化, 通過函式的返回值來確定初始化, 這樣你需要手動寫一個func
去做, 個人不太喜歡這樣的方式, 不過也是一種實現方式.
lazy var players: [String] = self.initialPlayers()
func initialPlayers() -> [String] {
var players = ["John Doe"]
return players
}
最後補充一下, get和set的方法屬於計算屬性, 不能拿來作為惰性初始化.Swift 程式語言中把這些理論統一用屬性來實現。Swift 中的屬性沒有對應的例項變數,屬性的後端儲存也無法直接訪問。這就避免了不同場景下訪問方式的困擾,同時也將屬性的定義簡化成一個語句。 一個型別中屬性的全部資訊——包括命名、型別和記憶體管理特徵——都在唯一一個地方(型別定義中)定義。
Swift 屬性介紹
參考文獻:
相關文章
- [譯] Swift 中的惰性序列及其原理Swift
- Swift,初始化Swift
- Swift初始化的安全方式Swift
- Swift-方法Swift
- angular路由中的惰性載入Angular路由
- Swift 的坑:static var 的初始化時機並不確定Swift
- Swift-6.方法Swift
- 基於 Generator 和 Iterator 的惰性列表
- 神經網路的初始化方法總結 | 又名“如何選擇合適的初始化方法”神經網路
- Angular 中使用惰性載入Angular
- JavaScript 函式惰性載入JavaScript函式
- Swift,下標簡化方法的呼叫Swift
- Swift中的方法名的那點事Swift
- Tim定時器初始化的方法定時器
- iOS 指定初始化方法iOS
- Swift UIColor 新增從十六進位制值初始化的擴充套件SwiftUI套件
- Swift-方法排程-類的普通方法底層探究Swift
- Swift iOS : WebView快取圖片的方法SwiftiOSWebView快取
- 七個Swift中的陷阱以及避免方法Swift
- Swift iOS : 顯示SVG檔案的方法SwiftiOSSVG
- 在Swift中使用JavaScript的方法和技巧SwiftJavaScript
- 初始化ArrayList的簡單方法總結
- 查詢初始化引數的方法(二)
- 查詢初始化引數的方法(一)
- 查詢初始化引數的方法(七)
- 查詢初始化引數的方法(六)
- 查詢初始化引數的方法(五)
- 查詢初始化引數的方法(四)
- 查詢初始化引數的方法(三)
- 惰性求值——lodash原始碼解讀原始碼
- JavaScript 專題之惰性函式JavaScript函式
- 00 #### `__init__` ,初始化方法
- C++11新初始化方法 使用{}初始化變數C++變數
- 利用 Lambda 表示式實現 Java 中的惰性求值Java
- 利用Lambda表示式進行Java中的惰性求值Java
- 在 Java 中初始化 List 的五種方法Java
- Oracle Goldengate重新初始化的 3種方法OracleGo
- Java 重寫方法與初始化的隱患Java