天天看點

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

以上代碼很好了解,沒什麼可說的。