---
# System prepended metadata

title: lazy variable 延遲儲存屬性

---

# lazy variable 延遲儲存屬性

### 使用方法
*在成員屬性前加lazy修飾字產生延遲儲存的效果，該屬性的初始值在第一次使用時才進行計算
*只能用在var變數，不能用在let變數；常量屬性必須在初始化完成前就被賦予值，因此不能使用lazy



### 使用時機
*由於變數會在第一次被使用時才計算，因此若變數沒有被呼叫過，則不會執行計算，因此可以節省效能



### 舉例說明

```objectivec=
class DataImporter {
    
    //DataImporter is a class to import data from an external file.
    //The class is assumed to take a non-trivial amount of time to initialize.
    
    var fileName = "data.txt"
    // the DataImporter class would provide data importing functionality here
}
 
class DataManager {
    lazy var importer = DataImporter()
    var data = [String]()
    // the DataManager class would provide data management functionality here
}
 
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// the DataImporter instance for the importer property has not yet been created

```

DataManager是一個管理資料的class，其目的為管理並提供訪問data的屬性。另外一個功能是從文件導入數據，此功能由DataImporter類提供，由於DataImporter實例在進行初始化時，需要打開文件(.txt)並讀取內容，故需要一定的時間進行。

DataManager可以從data或是DataImport取得並管理數據，因此當DataManager被創建時，不一定需要DataImporter的資料；因使在第一次使用DataImporter時才去創建它，可以更好的節省配置空間及效率。

```objectivec=

print(manager.importer.fileName)
// the DataImporter instance for the importer property has now been created
// prints "data.txt"
```

