สองบรรทัดต่อไปนี้เทียบเท่ากันหรือไม่?
1
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]
2
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]
สองบรรทัดต่อไปนี้เทียบเท่ากันหรือไม่?
1
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]
2
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]
คำตอบ:
Swift 3.0
คำตอบด้านล่างไม่เป็นเช่นนั้นอีกต่อไปเมื่อฉันทดสอบสิ่งนี้ เมื่อตั้งค่าnil
เป็นผลลัพธ์คือ NSCFData ถูกจัดเก็บ อาจเป็นการอ้างอิงวัตถุ NSNull แต่ฉันไม่คิดบวก
เพื่อลบค่าสำหรับการใช้คีย์อย่างสมบูรณ์ UserDefaults.standard.removeObject(forKey: "YourDefault")
ฉันทดสอบด้วยรหัสต่อไปนี้:
UserDefaults.standard.set(["a", "b", "c"], forKey: "MyDefaults")
print("Test A: My saved defaults \(UserDefaults.standard.object(forKey: "MyDefaults"))")
UserDefaults.standard.set(nil, forKey: "MyDefaults")
print("Test B: My defaults set to nil \(UserDefaults.standard.object(forKey: "MyDefaults"))")
UserDefaults.standard.removeObject(forKey: "MyDefaults")
print("Test C: My defaults removed \(UserDefaults.standard.object(forKey: "MyDefaults"))")
ใช่โค้ดทั้งสองบรรทัดเทียบเท่ากันทั้งสองบรรทัดจะส่งผลให้ไม่มีการอ่าน
id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];
NSUserDefaults
จะคืนค่าศูนย์หากไม่พบคีย์ ฉันอยากจะแนะนำให้ใช้removeObjectForKey
แทนการตั้งค่าเป็นศูนย์
นี่คือวิธีทดสอบว่าการตั้งค่าคีย์เป็นศูนย์ลบรายการคีย์ออกNSUserDefaults standardUserDefaults
หรือไม่
NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] copy];
for(NSString *key in keys) {
NSLog(@"Key Name: %@", key);
}
[keys release];
หรือเพียงแค่ถ่ายโอนพจนานุกรมคีย์ / ค่าของ NSUserDefaults standardUserDefaults
NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
removeObjectForKey
หรือไม่?
setObject:nil
ยังจะลบวัตถุไม่ใช่แค่คีย์ ดังนั้นฟังก์ชันทั้งสองจึงทำให้เกิดผลลัพธ์เหมือนกันทุกประการ นอกจากนี้หากคุณลบ (หรือตั้งค่าเป็นศูนย์) วัตถุที่เก็บไว้เพียงรายการเดียว (และคีย์) ไฟล์. plist ทั้งหมดจะถูกลบ
Swift 5.0 + iOS 11 ขึ้นไป
ทั้งสองวิธีลบค่า ลองสิ่งนี้ในสนามเด็กเล่น:
import Foundation
let key = "Test"
let value = "test"
let defaults = UserDefaults.standard
func printUD() {
print("UserDefaults after modification:\n")
defaults.dictionaryRepresentation().forEach { print("\($0): \($1)\n") }
print("-------------\n\n")
}
defaults.set(value, forKey: key); printUD()
defaults.set(nil, forKey: key); printUD()
defaults.set(value, forKey: key); printUD()
defaults.removeObject(forKey: key); printUD()
ก่อนที่จะมี iOS 11 นี้จะส่งผลให้ใน serializing nil
เข้าData
และโยนความผิดพลาด