检查旧版本的应用程序是否使用了 NSUserDefaults
Checking to see if NSUserDefaults was used in an older version of the app
我有一个几年前用 Obj C 开发的应用程序。我使用 NSUserDefaults 创建要显示的数据,如下所示:
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
if ([userData objectForKey:@"personDataArray"]==nil)
{
mutableDataArray = [[NSMutableArray alloc] init];
}
else
{
// get the array back out of NSUserDefaults
NSArray *tempArray = [userData objectForKey:@"personDataArray"];
// NSLog(@"The count in the temp saved data is %lu", (unsigned long)tempArray.count);
// look for any NSData objects in my temp array
for (NSData *personData in tempArray)
{
// set a instance of the person class to each NSData object found in the temp array
GD_Owed_Person *personObject = [[GD_Owed_Person alloc] init];
personObject = [NSKeyedUnarchiver unarchiveObjectWithData:personData];
// NSLog(@"CHECK ON THE ARRAY %@", personObject.personsBillsArray);
[mutableDataArray addObject:personObject];
}
}
默认的名字是personDataArray。
在新版本的应用程序中 (Swift 3) 我希望使用那些旧的默认设置。我遇到的问题是,当我检查这些默认值是否存在时,我得到了错误的反馈。
print(UserDefaults.standard.bool(forKey:"personDataArray"))
以下是我为上面的打印语句生成错误的步骤。
- 测试时从应用商店下载应用 iPhone。
- 输入一些用户数据并保存。
- 运行 通过 Xcode 测试的新应用 iPhone。
- 新应用安装和更新旧应用。
- 当我在 NSUserDefaults
中检查 personDataArray 时打印 returns false
我错过了什么?
这是错误的:
print(UserDefaults.standard.bool(forKey:"personDataArray"))
正确的方法和上面的代码一样:
if ([userData arrayForKey:@"personDataArray"]==nil) {
print("false")
} else {
print("true")
}
我想你在这里也有问题(尝试 arrayForKey):
NSArray *tempArray = [userData arrayForKey:@"personDataArray"];
键 personDataArray
的值是一个数组,它是一个对象而不是 Bool
Swift等价于
var dataArray = [GD_Owed_Person]()
if let tempArray = UserDefaults.standard.object(forKey:"personDataArray") as? [Data] {
for personData in tempArray {
let personObject = NSKeyedUnarchiver.unarchiveObject(with:personData) as! GD_Owed_Person
dataArray.append(personObject)
}
}
请不要在 Swift 中使用蛇形大小写 (GD_Owed_Person),请使用驼色大小写 (GDOwedPerson)
我有一个几年前用 Obj C 开发的应用程序。我使用 NSUserDefaults 创建要显示的数据,如下所示:
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
if ([userData objectForKey:@"personDataArray"]==nil)
{
mutableDataArray = [[NSMutableArray alloc] init];
}
else
{
// get the array back out of NSUserDefaults
NSArray *tempArray = [userData objectForKey:@"personDataArray"];
// NSLog(@"The count in the temp saved data is %lu", (unsigned long)tempArray.count);
// look for any NSData objects in my temp array
for (NSData *personData in tempArray)
{
// set a instance of the person class to each NSData object found in the temp array
GD_Owed_Person *personObject = [[GD_Owed_Person alloc] init];
personObject = [NSKeyedUnarchiver unarchiveObjectWithData:personData];
// NSLog(@"CHECK ON THE ARRAY %@", personObject.personsBillsArray);
[mutableDataArray addObject:personObject];
}
}
默认的名字是personDataArray。
在新版本的应用程序中 (Swift 3) 我希望使用那些旧的默认设置。我遇到的问题是,当我检查这些默认值是否存在时,我得到了错误的反馈。
print(UserDefaults.standard.bool(forKey:"personDataArray"))
以下是我为上面的打印语句生成错误的步骤。
- 测试时从应用商店下载应用 iPhone。
- 输入一些用户数据并保存。
- 运行 通过 Xcode 测试的新应用 iPhone。
- 新应用安装和更新旧应用。
- 当我在 NSUserDefaults 中检查 personDataArray 时打印 returns false
我错过了什么?
这是错误的:
print(UserDefaults.standard.bool(forKey:"personDataArray"))
正确的方法和上面的代码一样:
if ([userData arrayForKey:@"personDataArray"]==nil) {
print("false")
} else {
print("true")
}
我想你在这里也有问题(尝试 arrayForKey):
NSArray *tempArray = [userData arrayForKey:@"personDataArray"];
键 personDataArray
的值是一个数组,它是一个对象而不是 Bool
Swift等价于
var dataArray = [GD_Owed_Person]()
if let tempArray = UserDefaults.standard.object(forKey:"personDataArray") as? [Data] {
for personData in tempArray {
let personObject = NSKeyedUnarchiver.unarchiveObject(with:personData) as! GD_Owed_Person
dataArray.append(personObject)
}
}
请不要在 Swift 中使用蛇形大小写 (GD_Owed_Person),请使用驼色大小写 (GDOwedPerson)