检查旧版本的应用程序是否使用了 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"))

以下是我为上面的打印语句生成错误的步骤。

  1. 测试时从应用商店下载应用 iPhone。
  2. 输入一些用户数据并保存。
  3. 运行 通过 Xcode 测试的新应用 iPhone。
  4. 新应用安装和更新旧应用。
  5. 当我在 NSUserDefaults
  6. 中检查 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)