Преобразование NSNumbers, сохраненных в plist, в целые числа

Сохранение данных:

- (NSString *)dataFilePath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:kFilename];
}
- (void)applicationWillTerminate:(NSNotification *)notification
{
NSMutableArray *array = [[NSMutableArray alloc] init];

NSNumber *number = [NSNumber numberWithInt:points];
  [array addObject:number];

  [array writeToFile:[self dataFilePath] atomically:YES];
  [array release];
}

Чтение данных: BestLabel.text будет отображать высокий балл. Я получаю предупреждение: «присваивание делает целое число из указателя без приведения»

-(void)LoadData{
BestLabel.center = CGPointMake(150,300);

NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    loadint = [array objectAtIndex:0];
    NSString *myString35 = [NSString stringWithFormat:@"%d", loadint]; 
    BestLabel.text = myString35;
    [array release];
}
}

Пример кода, из которого я получил это, сохранял и загружал текстовые поля без проблем. Я полагаю, что мог бы преобразовать строку в int, но это кажется ненужным. Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ:

- (void)applicationWillTerminate:(NSNotification *)notification

{ NSMutableArray *array = [[NSMutableArray alloc] init];

if (points > highscore){

    NSString *myString35 = [NSString stringWithFormat:@"%d", points];
    [array addObject:myString35];
}else {
    NSString *myString35 = [NSString stringWithFormat:@"%d", highscore];
    [array addObject:myString35];
}


NSNumber *number = [NSNumber numberWithInt:GreenBlot.center.x];
[array addObject:number];
NSNumber *number2 = [NSNumber numberWithInt:GreenBlot.center.y];
[array addObject:number2];

А теперь загрузка с помощью:

NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    BestLabel.text = [array objectAtIndex:0];
    highscore = [[array objectAtIndex:0] intValue];


    lx = [[array objectAtIndex:1] intValue];
    ly = [[array objectAtIndex:2] intValue];
    GreenBlot.center = CGPointMake( lx,ly);


    [array release];
}

lx и ly — целые числа. Сначала я попробовал CGPointMake([[array objectAtIndex:1] intValue], [[array objectAtIndex:2] intValue]). Те же результаты, GreenBlot центрируется на 0,0. Есть идеи, почему?


person Community    schedule 04.09.2009    source источник
comment
Является ли loadint целым числом или NSNumber?   -  person mahboudz    schedule 04.09.2009


Ответы (3)


Проще всего использовать intValue:

loadint = [[array objectAtIndex:0] intValue];
person Community    schedule 04.09.2009
comment
Попытка этого .. см. основной пост. Попытка установить CGPointMake с помощью intValues ​​дает мне только 0,0. - person user128526; 04.09.2009
comment
1. Какой тип переменной возвращает GreenBlot.center.x? 2. К какому типу переменных относятся lx и ly? - person e.James; 04.09.2009

Вам нужна вторая строка ниже:

loadint = [array objectAtIndex:0];
int score = [loadint intValue];
NSString *myString35 = [NSString stringWithFormat:@"%d", loadint]; 

Если вы сохраняете только одно значение, используйте NSDictionary с ключом, который упрощает маркировку сохраняемого значения.

person Community    schedule 04.09.2009
comment
небольшое исправление: [loadint integerValue] возвращает NSInteger, который (в зависимости от системы) может быть или не быть int. Вы либо хотите изменить вызов метода на intValue, либо изменить тип score на NSInteger. - person Dave DeLong; 04.09.2009

CGPointMake определяется:

CGPoint CGPointMake(
    float x,
    float y
)

Вы берете GreenBlot.center.x, который предположительно является числом с плавающей запятой, и передаете его NSNumber как int.... Вернитесь и посмотрите на типы ваших переменных и измените их на [NSNumber numberWithFloat:...] и lx = [ [массив objectAtIndex:1] floatValue]; и т.д., в зависимости от обстоятельств.

Кроме того, вы создали другой вопрос при редактировании исходного вопроса.

person Community    schedule 04.09.2009