知道为什么我的if语句总能给出其他答案吗? 我从打印中注意到对象存储为" optional()",也许这个可选状态与nil不同?
class ViewController: UIViewController {
@IBOutlet weak var phoneLabel: UITextField!
@IBOutlet weak var phoneDisplayLabel: UILabel!
@IBAction func storeButton(_ sender: Any) {
UserDefaults.standard.removeObject(forKey: "Nb")
UserDefaults.standard.set("\(phoneLabel.text!)", forKey: "Nb")
print(UserDefaults.standard.object(forKey: "Nb") as Any)
}
@IBAction func retrieveButton(_ sender: Any) {
let phoneNB = UserDefaults.standard.value(forKey: "Nb")
if let phoneNbDisplay = phoneNB as? String {
if UserDefaults.standard.object(forKey: "Nb") != nil {
phoneDisplayLabel.text = "Your NB is \(phoneNbDisplay)"
}
else {
phoneDisplayLabel.text = "enter a number first"
}
}
}
}
答案 0 :(得分:2)
推荐的方法(Apple!)是在UserDefaults
中注册键/值对,以提供 - 如类名所暗示的 - 默认值。在第一次更改值之前,将考虑这些默认值。
Swift的好处是总有一个(非可选)值可以安全地解开。
尽快(例如applicationWillFinishLaunching
)添加这些行。它们应该在每次应用程序启动时执行。键Nb
使用空字符串默认值注册。
let defaultValues = ["Nb" : ""]
UserDefaults.standard.register(defaults: defaultValues)
在storeButton
中不要删除密钥,也不要对String
使用字符串插值,但请检查文本属性是否为nil
并保存在这种情况下是一个空字符串。打印线是荒谬的,因为在写完之后从UserDefaults
读取将不会得到更改,而您知道已写入的内容
@IBAction func storeButton(_ sender: Any) {
UserDefaults.standard.set(phoneLabel.text ?? "", forKey: "Nb")
}
在retrieveButton
中使用专用方法string(forKey
获取字符串,解包(由于注册密钥总是有值)并且只检查空字符串。并且不要读取(相同)值3次。
@IBAction func retrieveButton(_ sender: Any) {
let phoneNbDisplay = UserDefaults.standard.string(forKey: "Nb")!
if phoneNbDisplay.isEmpty {
phoneDisplayLabel.text = "enter a number first"
} else {
phoneDisplayLabel.text = "Your NB is \(phoneNbDisplay)"
}
}
答案 1 :(得分:1)
试试这个
if (UserDefaults.standard.value(forKey: "etc") != nil)
{
if (UserDefaults.standard.value(forKey: "etc") as! String).character.count == 0
{
//value is ""
}else{
//having some value
}
}
答案 2 :(得分:1)
正如vadian所评论的那样,在这种情况下,您不应该也不需要使用KVC方法value(forKey:)
。
试试这个:
@IBAction func storeButton(_ sender: Any) {
UserDefaults.standard.removeObject(forKey: "Nb")
UserDefaults.standard.set(phoneLabel.text ?? "", forKey: "Nb") //<-You have no need to use String Interpolation.
print (UserDefaults.standard.object(forKey: "Nb") as Any)
}
@IBAction func retrieveButton(_ sender: Any) {
if let phoneNB = UserDefaults.standard.string(forKey: "Nb") {
if !phoneNB.isEmpty {
phoneDisplayLabel.text = "Your NB is \(phoneNB)"
} else {
phoneDisplayLabel.text = "enter a number first"
}
} else {
//### What do you want to do if "Nb" is not set?
}
}
答案 3 :(得分:-1)
您可能忘记在存储值时调用同步。您可以尝试此操作。
Model.validate_unique()