我无法以userdefaults读写Firebase节点ID
let userRef = recordRef.child("users")
let userRecord = userRef.childByAutoId()
let newUserId = userRecord.key
let newUserDict = ["id": newUserId , "username": "admin" , "password": password , "userType": "power" , "active": "yes"]
let newUser = Users(dictionary: newUserDict as [String: Any])
userRecord.setValue(newUser.toDictionary())
let userdefault = UserDefaults.standard //adding login details in defaults for auto login
userdefault.set(id!, forKey: "schoolId")
userdefault.set(code, forKey: "schoolCode")
userdefault.set("admin", forKey: "username")
userdefault.set(password, forKey: "password")
userdefault.set("power", forKey: "userType")
userdefault.set(newUserId!, forKey: "userId")
现在,当我尝试读取schoolId或newUserID时,出现NIL值错误
print(userDefaults.string(forKey: "userID")!)
print(userDefaults.string(forKey: "userType")!)
有什么想法如何在用户默认值下读写节点ID?
答案 0 :(得分:0)
添加/检索对象时,应使用相同的键。您在保存userId
并检索userID
时使用了不同的密钥,因此由于userId
!= userID
,您将获得nil
的密钥。
一个更好的解决方案是为以下UserDefaults
键创建一个枚举,
enum UserDefaultKey: String {
case schoolId
case schoolCode
case username
}
使用枚举项类型将UserDefaults
扩展为set
和get
,
extension UserDefaults {
public func set<T>(_ value: T?, forKey: UserDefaultKey) {
self.set(value, forKey: forKey.rawValue)
}
public func value<T>(ofType: T.Type, for key: UserDefaultKey) -> T? {
return self.value(forKey: key.rawValue) as? T
}
}
然后您可以按以下方式使用这些键,
let userdefault = UserDefaults.standard
userdefault.set("YYYYY", forKey: .schoolId)
userdefault.set("Kam", forKey: .username)
print(userdefault.value(ofType: String.self, for: .schoolId)!)
print(userdefault.value(ofType: String.self, for: .username)!)