API返回nil参数存入NSUserDefaults后,如何读取该nil值?
嘿,这个问题其实涉及到UserDefaults一个容易被忽略的小细节——它并不真的存储nil值,我们来一步步拆解解决:
首先得明确:当你调用UserDefaults.standard.set(userType, forKey: "userType")传入nil时,UserDefaults的行为是直接删除这个"userType"对应的键,而不是把nil存进去。因为UserDefaults只支持plist兼容的类型(字符串、数字、数组、字典等),nil不在这个范围内,所以存nil等价于调用UserDefaults.standard.removeObject(forKey: "userType")。
那要读取这个逻辑上的"nil"值,你有两种可靠的方式:
1. 通用方案:使用object(forKey:)
这是最安全的通用方法,它返回Any?类型——如果键不存在(也就是你之前存了nil的情况),会直接返回nil。之后你可以根据实际类型做可选转型:
// 假设你的userType原本是String?类型 let savedUserType = UserDefaults.standard.object(forKey: "userType") as? String // 如果之前存的是nil,savedUserType会是nil,符合预期
如果是可选的基础类型(比如Int?),这个方法尤其重要——因为像integer(forKey:)这类方法会返回默认值0,而不是nil,用object(forKey:) as? Int才能得到你想要的nil结果。
2. 特定类型快捷方案:使用对应类型的可选方法
如果你确定要读取的是字符串、URL这类本身返回可选值的类型,可以直接用UserDefaults提供的类型专属方法,比如:
// 读取字符串类型,本身返回String? let savedUserType = UserDefaults.standard.string(forKey: "userType") // 键不存在时会返回nil,和你要的效果一致
同样的,url(forKey:)这类方法也遵循这个逻辑,返回可选类型,键不存在时返回nil。
总结一下:你要替换的"?"最通用的答案是object,也就是UserDefaults.standard.object(forKey: "userType"),再配合类型转型就能正确获取到逻辑上的nil值啦。
内容的提问来源于stack exchange,提问作者Ali Ihsan URAL

