天天看点

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 对象设置值的类方法、实例方法,以及检索这些值的实例方法:

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

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 的常用方法

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

数组对象

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]];
           

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