你可以将NSString强制转换为NSInterger吗?如果字符串只包含数字?

时间:2010-09-11 18:58:52

标签: iphone objective-c

我有一些数字存储在NSString中。

将它们提取到像这样的NSInterger中是否安全:

NSString* path = [[NSBundle mainBundle] pathForResource:@"rugby" ofType:@"txt" inDirectory:@""];
NSString* data = [NSString stringWithContentsOfFile:path encoding: NSUTF8StringEncoding error: NULL];
NSMutableArray *statsHolder = [[NSMutableArray alloc] init];

[statsHolder addObject:[NSString [data substringWithRange:NSMakeRange(0, 3)] integerValue]];

我误解了如何做到这一点还是有效?

我的第二个问题是关于物体。我正在尝试复制对象。我担心如果我将一个对象复制到一个数组然后更改复制到该数组的对象中包含的值,该数组中的对象也将更改值,因为它只是一个指向原始对象的指针。我在代码中演示了我的意思,因为很难说清楚。

    else if ([newString isEqualToString: newline])
    {
        [statsHolder addObject:[[data substringWithRange:NSMakeRange(i-rangeCount, rangeCount)] integerValue]]; 
        commaCount=0;
        rangeCount=0;
        Card  *myCard = [[Card alloc] init];
        myCard.name = nameHolder;
        myCard.information = infoHolder;
        for (int x = 0; x < [statsHolder count]; x++)
             {
                 [myCard.statsArray addObject:[statsHolder objectAtIndex:x]];   
             }

        [deckArray addObject:myCard];       
        [myCard autorelease];
        [statsHolder removeAllObjects];

    }

您可以在上面看到我正在填充一个名为Card *mycard的对象,然后将其复制到我的NSMutableArray *deckArray

NSString *nameHolder = @"";
NSString *infoHolder = @"";
NSMutableArray *statsHolder = [[NSMutableArray alloc] init];

在收集数据之前,我的vars是否保存数据,然后才能填充Card对象并将其复制到数组中。

所以我的问题是..我存储在数组中的所有Card对象是否都指向

中包含的最后一个值
NSString *nameHolder = @"";
NSString *infoHolder = @"";
NSMutableArray *statsHolder = [[NSMutableArray alloc] init];

由于数组和指针的工作方式?

很抱歉提出一个很复杂的问题。 :)

-Code

3 个答案:

答案 0 :(得分:1)

  1. 是的,要将NSString转换为NSInteger,-integerValue是正确的方法。 但是,NSInteger不是Objective-C对象类型。因此,它不能存储在NSArray中。你必须用NSNumber包装整数,即

    NSInteger theValue = [[data substringWithRange:NSMakeRange(0,3)] integerValue];
    NSNumber* boxedValue = [NSNumber numberWithInteger:theValue];
    [statsHolder addObject:theValue];
    

答案 1 :(得分:1)

只需使用[NSString integerValue]属性从字符串中获取int值。然后,您可以将其存储在TheValue之类的变量中,并将其作为int或NSNumber放入数组中。我不确定NSInteger是否可以进入数组,除非它在NSDictionary中。

答案 2 :(得分:1)

integerValue方法是将字符串转换为整数的完美方法。另一种方法,特别是如果您计划在字符串中存储多个整数(可能用逗号分隔),则为NSScanner

NSScanner *scanner = [NSScanner scannerWithString:someString];

NSInteger number1, number2;

[scanner scanInteger:&number1];            // Copy the first int
[scanner scanString:@"," intoString:NULL]; // Skip the comma
[scanner scanInteger:&number2];            // Copy the second int

在将数字放入数组之前,需要将数字包装在某种对象中。 NSNumber专为此而设计:

[myArray addObject:[NSNumber numberWithInteger:number1]];

最后,在Card类上设置属性时会发生什么取决于您如何声明属性或编写方法。当谈到字符串时,复制它们通常是一个好主意:

@interface Card : NSObject
{
// …
}
@property (nonatomic, copy) NSString *name;
@end

现在,当您card.name = xyz时,该卡会存储xyz的副本。如果原件被修改或释放,则不会影响卡片的字符串副本。