Swift裡我用這個姿勢寫UserDefaults

2021-09-11 10:04:51 字數 1745 閱讀 3323

人在江湖飄,總免不了要存一些值到userdefaults。

userdefaults.standard.set("@沒故事的卓同學", forkey: "author")

let author = userdefaults.standard.value(forkey: "author")複製**

有存就有取,還可能有很多地方會取這個值。這樣的話每次寫這個 key 就有點蛋疼了。

利用 rawvalue 型別為 string 的列舉作為 key,通過協議為指定列舉增加訪問到 userdefaults 的能力。

首先宣告乙個列舉,建議在userdefaults的擴充套件裡寫,當然如果你想要省掉前面乙個命名空間也是可以的:

extension

userdefaults

}複製**

注意到這個列舉需要實現userdefaultsettable協議。

接著就可以在這個列舉裡呼叫store(value: )方法來儲存:

userdefaults.testdata.name.store(value: "name")

let storevalue = userdefaults.testdata.name.storedstring複製**

這個列舉testdata.name可以理解為一張銀行卡。拿著這張卡到銀行,說我要存,就夠了。這個列舉就是乙個id。

這個思路和swift 3以後的通知中心形式相似。

notification.name 也是乙個 rawvalue 為字串的列舉。

extension

nsnotification

}複製**

當然嚴格的說並不是乙個列舉,只是和列舉一樣實現了rawrepresentable協議。不過我覺得直接宣告乙個列舉在這裡會比實現rawrepresentable便捷一些。

主要就是userdefaultsettable協議的擴充套件了。

public

protocol

userdefaultsettable

}public

extension

userdefaultsettable

where

self: rawrepresentable, self.rawvalue == string

public

var storedvalue: any?

// 為所有的key加上列舉名作為命名空間,避免重複

public

var uniquekey: string

public

func

store

(value: bool)

public

var storedbool: bool

// 還有支援其他儲存型別的函式,就不全寫了

}複製**

主要的實現**很簡單,就是為 rawvalue 為 string 的列舉新增了 store 和 獲取儲存 value 的方法。

為了避免直接取列舉的名字作為key可能引起的重名,宣告了乙個計算屬性來生成儲存的 key,規則就是加上列舉 type 名作為字首。比如上面的例子裡儲存的 key 就是 testdata.name 。

userdefault 資料儲存和讀取簡易封裝

我在這個開源專案裡找到了童年!

提到 俄羅斯方塊 tetris 那真是幾乎無人不知無人不曉,除此之外,相信許多程式設計師第乙個程式設計實踐專案就是編寫乙個俄羅斯方塊或者是坦克大戰 這類的遊戲各種程式語言的實現版本都有,今天和大家分享乙個用react 編寫的俄羅斯方塊,在移動端和 pc 都能執行。先上效果讓你們預覽一下 redux ...

我用這個C作業應付了期末實驗

下面是 是用來建立原有通訊錄的。include include include const int maxlen 500 char fname 20 tel.txt int len int n typedef struct telephone tel tel tele 100 main intins...

這個夏天的我

這個夏天裡約奧運會,這個夏天人生中經歷第一次考驗,跪著走完自己選的路。這個夏天我有許多不一樣的感受 在學校和實驗室的朋友一起努力,感受清貧和阻力,還有便是即將成為乙個學長的體驗。不知為什麼,我發現自己似乎越來越會裝深沉,經常一副長者的口吻,不過大抵我也是不甘的吧,希望他們會有乙個比較好的大學生活,至...