# Swift中使用UserDefaults小纸条

### 简单使用

在Swift中可以通过UserDefaults来存取配置信息非常方便。就像这样：

```
import Foundation

let defaults = UserDefaults.standard
defaults.set("hello name", forKey: "name")
print(defaults.string(forKey: "name"))
```

可以通过set方法存储各种内容，可以通过以下方法获取内容：

* integer(forKey:) returns an integer if the key existed, or 0 if not.
* bool(forKey:) returns a boolean if the key existed, or false if not.
* float(forKey:) returns a float if the key existed, or 0.0 if not.
* double(forKey:) returns a double if the key existed, or 0.0 if not.
* object(forKey:) returns AnyObject? so you need to conditionally typecast it to your data type.

可以参考[苹果官方的文档](https://developer.apple.com/documentation/foundation/userdefaults)。

### 设置一个enum简化使用

对于UserDefaults的使用，还可以考虑通过extension出一个enum来方便访问和管理。再加上自己的warp函数处理，会让你的使用方便很多。

```
extension UserDefaults{
    enum  UserDefaultsKeys:String {
        case name
        case age
        case isMarried
    }
    
    func getName()->String{
        return string(forKey: UserDefaultsKeys.name.rawValue) ?? ""
    }
    
    func setName(_ value: String){
        set(value, forKey: UserDefaultsKeys.name.rawValue)
    }
    
}

let defaults = UserDefaults.standard
defaults.setName("Hello World")
print(defaults.getName())
```

### 缺省值设置

对于Bool，它的bool返回缺省值为false。所以我们可以通过register来设置它的缺省值：

```
extension UserDefaults{
    enum  UserDefaultsKeys:String {
        case isAutoPronounce
    }
    
    func isAutoPronounce()->Bool{
        register(defaults: [UserDefaultsKeys.isAutoPronounce.rawValue : true])
        return bool(forKey: UserDefaultsKeys.isAutoPronounce.rawValue)
    }
    
    func setIsAutoPronounce(_ value: Bool){
        set(value, forKey: UserDefaultsKeys.isAutoPronounce.rawValue)
    }
}
```

### SwiftUI使用

如果我们要在SwiftUI中Bind这个isAutoPronounce设置，可以使用@AppStorage声明

```
@AppStorage(UserDefaults.UserDefaultsKeys.isAutoPronounce.rawValue) var isAutoPronounce = true
```

这样在View里可以直接使用了

```
Toggle("Auto pronounce", isOn: $vm.isAutoPronounce)
```

