Objective-C 2.0 学习笔记十一(Number, Strings, and Collections)

变更履历

版本:v1.0

介绍

本节记录了Foundation框架提供的一些基本对象。这些基本对象包括数字、字符串和集合。集合指的是数组(arrays)、字典(dictionaries)和集(sets)。

Number Objects

基本类型不是对象,不仅是 OC,在 Java 中也是这样。在 NSArray 这样的类中是不能使用基本数据类型的,这时我们可以使用 NSNumber 类,它可以存储任何基本数据类型(包括char)。下面是一个例子:
#import <Foundation/Foundation.h>

int main(int argc, const char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
    NSNumber *myNumber, *floatNumber, *intNumber;
    NSInteger myInt;
    
    // integer value
    // 
    intNumber = [NSNumber numberWithInteger: 100];
    myInt = [intNumber integerValue];
    NSLog(@"%li", (long) myInt);

    // long value
    // 
    myNumber = [NSNumber numberWithLong: 0xabcdef];
    NSLog(@"%lx", (long) myNumber);

    // char value
    // 
    myNumber = [NSNumber numberWithLong: 'X'];
    NSLog(@"%c", [myNumber charValue]);

    // float value
    floatNumber = [NSNumber numberWithFloat: 100.00];
    NSLog(@"%g", [floatNumber floatValue]);
    
    // double
    // 
    myNumber = [NSNumber numberWithDouble: 12345e+15];
    NSLog(@"%lg", [myNumber doubleValue]);
    
    // Wrong access here
    // 
    NSLog(@"%li", (long) [myNumber integerValue]);

    // Test two Numbers for equality
    // 
    if ( [intNumber isEqualToNumber: floatNumber] == YES )
        NSLog(@"Number are equal");
    else
        NSLog(@"Number are not equal");

    // Test if one Number is <, ==, or > second Number
    // 
    if ( [intNumber compare: myNumber] == NSOrderedAscending )
        NSLog(@"First number is less than second");

    [pool drain];
    return 0;
}

NSInteger 不是类,而是基本数据类型的 typedef。有可能是 64 位的 long;也可能是 32 位的 int。
下表列出了 NSNumber 对象设置值的类方法、实例方法,以及检索这些值的实例方法:


String Objects

NSString 用于处理字符串对象。NSString 对象由 unichar 字符组成。Unichar 是符合 Unicode 标准的多字节字符。

More on the NSLog Function

输出 NSString 对象
NSString *str = @"Programming is fun.";
NSLog(@"%@", str);

NSNumber 对象也可以使用 %@ 来输出
NSLog (@"%@", intNumber);

The description Method

description 方法与 Java 的 toString 方法一样。重写它可以让我们在调用 NSLog 时显示任何我们想要的内容。
下面是 NSString 类的 description 方法定义:
-(NSString *) description
{
    return [NSString stringWithFormat: @"%i/%i", numerator, denominator];
}

可变对象 vs 不可变对象(Mutable Versus Immutable Objects)

NSString 与 Java 的 String 类型是一样的,创建的都是不可变对象。所谓不可变就是不能在这个对象实例中更改值,所作的任何更改都会产生新的对象。

不可变对象的好处
1、更好的性能,在 Java 中,存在一个称为常量池的内存区域,所有常量字符串都存储在这个区域,当新的String实例创建时,会首先去这个内存区域中查找是否存在相同的字符串常量,如果有,则将新String实例的指针指向这块内存。如果没有,则创建新的内存存储字符串常量。
2、线程安全,在多线程中,不可变对象是线程安全的。
3、安全检查
4、hashCode
5、类加载机制,类名也是字符串。
6、操作的便利性

使用一个字符串创建新的字符串:
res = [NSString stringWithString: str1];

连接两个字符串
res = [str1 stringByAppendingString: str2];

使用 isEqualToString 比较两个字符串是否相等:
if ([str1 isEqualToString: res] == YES)
    ...

使用 compare 比较两个字符串是否相等(大小写敏感):
NSComparisonResult compareResult = [str1 compare: str2];

使用 compare 比较两个字符串是否相等(大小写不敏感):
NSComparisonResult compareResult = [str1 caseInsensitiveCompare: str2];

字符串比较结果
使用 compare 或 caseInsensitiveCompare 比较字符串有三个结果:
  • NSOrderedAscending        第一个字符串小于第二个字符串。
  • NSOrderedSame                相等。
  • NSOrderedDescending     第一个字符串大于第二个字符串。
转换为大写
res = [str1 uppercaseString];

转换为小写
res = [str1 lowercaseString];

NSRange 类型
NSRange 类型用来指定范围,NSString 中的一些方法会用到。NSRange 定义有两个成员 location 和 length。location 是起始索引数;length 是字符计数。

substringToIndex
创建一个子字符串,从首字符 0 开始,执行到索引数。

substringFromIndex
创建一个子字符串,从指定的索引开始,直到字母末尾。

substringWithRange
接收一个范围,并返回指定范围的字符,NSMakeRange 函数用于创建一个 NSRange,这个结果可以作为 substringWithRange:方法的参数。
NSMakeRange(8, 6);

rangeOfString
在一个字符串中查找字符串。返回 NSRange 类型可以精确地指出字符串的位置。如果没有找到,则 NSRange 的 location 被设置为 NSNotFound
range = [str rangeOfString: @"string"];

可变字符串

NSMutableString 用于创建可更改字符的字符串对象。它是 NSString 的子类。

一些 NSString 和 NSMutableString 的常用方法






数组对象

Foundation 数组是有序的对象集合。数组也存在可变数组和不可变数组。NSArray 是不可变数组;NSMutableArray 是可变数组。另外,NSArray 和 NSMutableArray 只能存储对象,简单类型是不可以的。
一下代码用于创建一个数组
[NSArray arrayWithObjects:@"January", @"February", @"March", @"April", ..., @"December", nil]

arrayWithObjects 方法可接受可变数目的参数。要标记参数列表的结束,最后一个值必须指定为 nil。
for ( i = 0; i < 12; i++ )
    NSLog(@"%2i %@", i + 1, [monthName objectAtIndex:i]);

objectAtIndex 用于遍历数组,数组下标从0开始。
由于数组只能存储对象,所以,对于基本类型来说,需要使用对象类型,比如 NSNumber 可以用来存储整数。
NSMutableArray *primes = [NSMutableArray arrayWithCapacity: 20];

[primes addObject: [NSNumber numberWithInteger:2]];
[primes addObject: [NSNumber numberWithInteger:3]];

以上代码很好理解,没什么可说的。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值