工作在Fundation框架下2——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(十六)

创建数组

正如本章前面所描述的值类,您可以通过分配和初始化,类工厂的方法,或数组常量创建一个数组。 
可有多种不同的初始化和工厂方法,取决于对象的数目。
+ (id)arrayWithObject:(id)anObject;
+ (id)arrayWithObjects:(id)firstObject, ...;
- (id)initWithObjects:(id)firstObject, ...;

因为 arrayWithObjects:和initWithObjects:方法都接受一个无终止的,可变数目的参数,你必须包括为零的最后一个值。
NSArray *someArray =
[NSArray arrayWithObjects:someObject, someString, someNumber, someValue, nil];

此示例创建像前面显示一个数组。第一个对象,someObject,将具有0的数组索引;的最后一个对象,someValue中,将具有3的索引。 
而nil是作为数组结束的标志,是必须的。
id firstObject = @"someString";
id secondObject = nil;
id thirdObject = @"anotherString";
NSArray *someArray =
  [NSArray arrayWithObjects:firstObject, secondObject, thirdObject, nil];

在这种情况下,包含的someArray仅firstObject,因为secondObject是nil,将被解释为项目的列表的末尾。 
它可以创建使用紧凑语法的数组。
NSArray *someArray = @[firstObject, secondObject, thirdObject];

当使用这种语法,不终止与未缴其实对象列表,nil是一个无效的值。例如,你会在运行时得到一个异常,如果你尝试执行下面的代码:
id firstObject = @"someString";
id secondObject = nil;
NSArray *someArray = @[firstObject, secondObject];
// exception: "attempt to insert nil object"

遍历数组对象

当你创建一个数组,可以查询它的信息,如多少个对象具有或是否包含给定的项目。
NSUInteger numberOfItems = [someArray count];
 
if ([someArray containsObject:someString]) {
    ...
}

您也可以查询数组中的项目给定的索引处。如果你试图请求一个无效的指标,你会在运行时得到一个异常——出界。为了避免收到一个异常,总是首先检查的项目数。
if ([someArray count] > 0) {
    NSLog(@"First item is: %@", [someArray objectAtIndex:0]);
}

此示例检查的项目数是否大于零。如果是,该Fundation函数的NSLog记录中的第一项,它具有的索引为0的描述。 
作为替代使用objectAtIndex:,你也可以使用下标语法,这就像在一个标准的C数组访问值查询数组。前面的例子可以重写是这样的:
if ([someArray count] > 0) {
    NSLog(@"First item is: %@", someArray[0]);
}

排序数组对象

NSArray类提供了各种方法来收集其对象进行排序。因为NSArray的是不可改变的,每一种方法返回一个包含在排序顺序中的项目一个新的数组。 
每个字符串:例如,你可以通过调用比较排序字符串数组。
NSArray *unsortedStrings = @[@"gammaString", @"alphaString", @"betaString"];
NSArray *sortedStrings =
         [unsortedStrings sortedArrayUsingSelector:@selector(compare:)];

不确定性

虽然NSArray类本身是不可变的,它仍然可以包含可变对象。例如,如果添加了一个可变的字符串到一个不可变的数组,如下所示:
NSMutableString *mutableString = [NSMutableString stringWithString:@"Hello"];
NSArray *immutableArray = @[mutableString];
你变化的字符串中无法停止。
if ([immutableArray count] > 0) {
    id string = immutableArray[0];
    if ([string isKindOfClass:[NSMutableString class]]) {
        [string appendString:@" World!"];
    }
}

如果你想初始创建后从一个数组中添加或删除对象,请使用NSMutableArray里,它增加了多种方法来添加,删除或替换一个或多个对象
NSMutableArray *mutableArray = [NSMutableArray array];
[mutableArray addObject:@"gamma"];
[mutableArray addObject:@"alpha"];
[mutableArray addObject:@"beta"];
 
[mutableArray replaceObjectAtIndex:0 withObject:@"epsilon"];

此示例创建由对象组成的数组@“epsilon”,@“alpha”,并@“beta”。 
它也可以将可变数组排序的地方,而无需创建一个二级数组。
[mutableArray sortUsingSelector:@selector(caseInsensitiveCompare:)];
在这种情况下,所包含的项目进行排序进入升,不区分大小写的顺序@“alpha”,@“beta”,并@“epsilon”。

集合

一集合(NSSet)对象类似于数组,但是它维护不同的对象的无序组。
工作在Fundation框架下2——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(十六)
因为集合不维持秩序,他们提供更快的性能,当涉及到成员资格测试比数组做。 
因为基本的NSSet类是不可变的,其内容必须在创建时指定,或者使用分配和初始化或类工厂方法。
NSSet *simpleSet =
  [NSSet setWithObjects:@"Hello, World!", @42, aValue, anObject, nil];

与NSArray的,在initWithObjects:和setWithObjects:方法都接受一个无终止的,可变数目的参数。在可变的NSSet子类的名称是NSMutableSet。 
集合只存储一个引用单个对象,即使你尝试添加一个对象不止一次。
  NSNumber *number = @42;
    NSSet *numberSet =
      [NSSet setWithObjects:number, number, number, number, nil];

字典

不是简单地保持对象的有序或无序集合,字典(NSDictionary)中存储对象与给定的密钥,然后它可以用于检索有关对象。 
最好的做法是使用字符串对象作为字典键。
工作在Fundation框架下2——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(十六)
虽然您可以使用其他对象作为键,记住,每个键被复制为一个字典的使用,所以必须支持NSCopying。如果你想使用键 - 值编码,但是,你必须使用字符串键的字典对象(了解更多信息,请参阅键 - 值编码编程指南)。

创建一个字典

您可以使用两种分配和初始化,或类工厂方法,这样创建字典:
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
               someObject, @"anObject",
         @"Hello, World!", @"helloString",
                      @42, @"magicNumber",
                someValue, @"aValue",
                      nil];

对于dictionaryWithObjectsAndKeys:和initWithObjectsAndKeys:方法,每个对象指定其键之前,和对象键的列表必须零终止。 
Objective-C语言提供了一个简洁的语法字典文字创作。
NSDictionary *dictionary = @{
              @"anObject" : someObject,
           @"helloString" : @"Hello, World!",
           @"magicNumber" : @42,
                @"aValue" : someValue
};

对于字典文字,关键是其指定对象之前,和对象键的列表不是无终止。

查询字典

当你创建了一个字典,你可以问它存储对给定键的对象。
NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];

如果没有找到对象,该objectForKey:方法返回nil。 
还有一个标语法的替代品使用objectForKey:。
NSNumber *storedNumber = dictionary[@"magicNumber"];

不确定性

如果你需要创建后从字典中添加或删除对象,请使用的NSMutableDictionary子类。
[dictionary setObject:@"another string" forKey:@"secondString"];
[dictionary removeObjectForKey:@"anObject"];

用NSNull代表nil

它不能添加无本节所描述的集合类,因为无Objective-C中的意思是“没有对象。”如果你需要表示“没有对象”的集合,使用NSNull类。
NSArray *array = @[ @"string", @42, [NSNull null] ];

与NSNull,空方法总是返回相同的实例。这表现在这样的类被称为单实例类。你可以检查阵列中的对象是否等于这样的共享NSNull实例:
for (id object in array) {
    if (object == [NSNull null]) {
        NSLog(@"Found a null object");
    }
}

虽然Foundation框架包含了许多比这里描述了更多的功能,你不需要知道每一个细节的时候了。如果你想了解更多有关基金会,看看Foundation框架参考。现在,你有足够的信息来继续实现你的todolist的应用程序,你会做通过编写自定义数据类。

工作在Fundation框架下2——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(十六)

上一篇:小米2/2S 手机由 Smartisan OS ROM 刷回 MIUI 教程


下一篇:C# string byte[] Base64 常用互相转换