Swift如何为用户生成随机字母数字字符串并存储到UserDefaults
问题核心原因
你的代码不能正常运行的根本问题是:get和set方法每次被调用时,都会生成全新的16位随机字符串作为UserDefaults的存储key,写入时用的key和读取时用的key完全不一致,自然读不到之前写入的值。
实现思路
如果要实现每个用户生成唯一专属随机字符串、持久化存储的需求,逻辑应该是:
- 用一个固定的字符串作为UserDefaults的存取key,专门用来存储你生成的用户专属随机串
- 第一次需要使用这个专属串的时候生成一次,写入UserDefaults
- 后续所有读取操作都直接返回已经存在的串,不要重复生成
修正后代码示例
// 固定的UserDefaults存取key,可根据你的业务修改命名 private let userUniqueIDKey = "user_unique_random_id" func randomString(of length: Int) -> String { let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" var s = "" for _ in 0 ..< length { s.append(letters.randomElement()!) } return s } // 用户专属唯一串,全局调用即可 static var userUniqueString: String { get { // 优先读取已存储的串 if let existID = UserDefaults.standard.string(forKey: userUniqueIDKey) { return existID } // 无存储的串则生成新串,写入后返回 let newID = randomString(of: 16) UserDefaults.standard.set(newID, forKey: userUniqueIDKey) UserDefaults.standard.synchronize() return newID } }
补充说明
如果你原本是要实现「判断是否首次启动」的Bool标记功能,可以用如下实现:
private let firstLaunchKey = "is_first_launch" static var isFirstLaunch: Bool { get { !UserDefaults.standard.bool(forKey: firstLaunchKey) } set { UserDefaults.standard.set(!newValue, forKey: firstLaunchKey) } } // 启动时调用示例 // if isFirstLaunch { // 执行首次启动专属逻辑 // isFirstLaunch = false // }
- 如果需要用户专属串在App卸载重装后也保持不变,可以改用Keychain存储该随机串
- 随机串的长度可根据业务需求灵活调整,16位已经可以满足绝大多数唯一标识场景的需求
内容的提问来源于stack exchange,提问作者user17459204
相关产品推荐
相关产品推荐

