ios NSString与LongValue,usignedLongValue,longlongValue

849 阅读1分钟

##这是一个关于类型转换的问题。

很多时候我们在获取网络传输过来的数据,还有获取一个id类型的数组中元素的时候,通常会进行类型转换,只是有时候类型转换也是会出现问题的。

####例子1:

NSString *num = @"1";
long newNum = [num longValue];
NSLog(@"num=: %ld", newnum);

其实这段编译是会报错的但是,有集中情况是可以通过编译的。 ####例子2:

NSString *num2 = @"22";
NSDictionary *dict = @{@"num2": num2};
long newnum = [[dict objectForKey: @"num2"] longValue];
NSLog(@"num2: %ld", num2); ####例子3: NSString *num3 = @"333";
NSArray *array = @[ num3 ];
long newnum = [array[0] longValue] ; NSLog(@"num3: %ld", num3);

以上两种情况编译都不会出现问题,但是当运行时就会发生错误,因为NSString类型是没有longValue的方法的,它是NSNumber的方法,同理 usignedLongValue,NSString中也是没有usignedLongValue方法的,所以在进行任何类型的转换之前先确定对象是不是能够调用该方法。

respondsToSelector是很好的保护机制,在不知道数据类型的时候可以使用id 来接收然后通过判断在转换成对应的需要的类型 比如:接着上面array

for (int i = 0;i <array.count;i++){ id objc = array[i]; if ([objc respondsToSelector:@selector(LongValue)]){ long newnum = [objc longValue] ;
} }

这样的话就不会由于调用了没有的方法而报错了。 这里至在说明,在进行类型转换的时候需要谨慎,最好查看下手册,看看是不是支持这样的转换。