Swift下UserDefaults的正确姿势

刚刚在微博上看到一篇关于UserDefaults的文章,想起来之前在swift.gg上看到一篇关于在3.0下,UserDaults的正确使用姿势,记录下来。关于那篇文章,我已经有转发 http://weibo.com/ppsheep
感兴趣可以上去瞧瞧

在swift.gg上有一篇详细介绍swift 3.0下,UserDefaults的使用,只是当时读到这篇文章,没有看到demo,就顺手写了一个,理解也更加深刻。

这里我就把demo直接粘出来好了,其实就是一个扩展,这里用到了空间、枚举等特性,具体我就不作介绍,肯定没这篇文章写得好 文章链接 http://www.swift.gg/2017/01/16/swift-userdefaults-protocol/

对UserDefaults进行扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

import Foundation

protocol KeyNamespaceable { }

extension KeyNamespaceable {
static func namespace<T>(_ key: T) -> String where T: RawRepresentable {
return "\(Self.self).\(key.rawValue)"
}
}

protocol BoolUserDefaultable : KeyNamespaceable {

associatedtype BoolDefaultKey : RawRepresentable
}

extension BoolUserDefaultable where BoolDefaultKey.RawValue == String {

// BoolUserDefaultable extension
static func set(_ value: Bool, forKey key: BoolDefaultKey) {
let key = namespace(key)
UserDefaults.standard.set(value, forKey: key)
}

static func bool(forKey key: BoolDefaultKey) -> Bool {
let key = namespace(key)
return UserDefaults.standard.bool(forKey: key)
}
}

protocol StringUserDefaultable : KeyNamespaceable {

associatedtype StringDefaultKey : RawRepresentable
}

extension StringUserDefaultable where StringDefaultKey.RawValue == String {
// StringUserDefaultable extension
static func set(_ value: String, forKey key: StringDefaultKey) {
let key = namespace(key)
UserDefaults.standard.set(value, forKey: key)
}

static func string(forKey key: StringDefaultKey) -> String? {
let key = namespace(key)
return UserDefaults.standard.string(forKey: key)
}
}

extension UserDefaults {

struct Account : BoolUserDefaultable {
enum BoolDefaultKey : String {
case isUserLoggedIn
}
}

struct AccoutToken : StringUserDefaultable {
enum StringDefaultKey : String {
case userToken
}
}
}

其中的知识,都是用到了上面那篇文章中的

有了这个扩展之后,加入我们需要记录一下登录的标志,只需要

1
2
3
4
//设置登录标志
UserDefaults.Account.set(true, forKey: .isUserLoggedIn)
//获取登录标志
UserDefaults.Account.bool(forKey: .isUserLoggedIn)

使用起来非常简洁明了,当然并不局限于bool 我还扩展了String,其他的就可以依葫芦画瓢

最近新建了一个微博,还是觉得公众号有一些局限性,并且感觉微博更能关注业界的动态,同样欢迎大家关注:ppsheep_Qian

欢迎大家关注我的公众号,我会定期分享一些我在项目中遇到问题的解决办法和一些iOS实用的技巧,现阶段主要是整理出一些基础的知识记录下来

上边是公众号,下边是我个人微信

文章也会同步更新到我的博客:
http://ppsheep.com