创建数组
正如本章前面所描述的值类,您可以通过分配和初始化,类工厂的方法,或数组常量创建一个数组。
可有多种不同的初始化和工厂方法,取决于对象的数目。
可有多种不同的初始化和工厂方法,取决于对象的数目。
+ (id)arrayWithObject:(id)anObject; + (id)arrayWithObjects:(id)firstObject, ...; - (id)initWithObjects:(id)firstObject, ...;
NSArray *someArray = [NSArray arrayWithObjects:someObject, someString, someNumber, someValue, nil];
而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)对象类似于数组,但是它维护不同的对象的无序组。因为集合不维持秩序,他们提供更快的性能,当涉及到成员资格测试比数组做。
因为基本的NSSet类是不可变的,其内容必须在创建时指定,或者使用分配和初始化或类工厂方法。
因为基本的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)中存储对象与给定的密钥,然后它可以用于检索有关对象。
最好的做法是使用字符串对象作为字典键。
最好的做法是使用字符串对象作为字典键。
虽然您可以使用其他对象作为键,记住,每个键被复制为一个字典的使用,所以必须支持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版)系列源文档翻译(十六)