扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Working with Foundation
专注于为中小企业提供做网站、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业云龙免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了超过千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
使用Foundation框架
当你开始为你的app编写代码的时候,你将发现有很多的Objective-C框架你能够利用。特别重要的是Foundation framework,它为所有的app提供了基础的服务。Foundation框架包含了代表基本数据类型的值类(value classes)例如字符串和数字,以及存储其他对象的集合类(collection class)。你将依赖值类和集合类来为你的ToDoList app编写很多代码。
Value Objects
值对象
Foundation框架提供一般值对象的类,包括字符串、二进制数据、日期和时间、数字和其他数值。
之对象是一个封装了原始值(C数据类型)的对象,且给值提供了相应的服务。你经常遇到的值对象是app 中调用的方法或者函数中作为返回值和参数存在的。框架中的不同部分——甚至不同框架——能通过传递值对象来改变数据。
一些在Foundation框架中的值对象例子:
NSString andNSMutableString
NSData andNSMutableData
NSDate
NSNumber
NSValue
因为值对象代表标量值,你能在集合中以及任何需要的地方使用他们。值对象有远胜于他们封装原始类型:他们让你简单高效的执行某些封装的操作。举个例子,NSString类,有搜索和替换子字符串的方法,把字符串写到文件或者URLs中,以及构建文件的系统路径。
你从元类型数据(然后或许在方法参数中传递它)中创建值对象。在你的代码中,你稍后访问从对象的封装数据。NSNumber类提供这种方法最清晰的例子
.intn=5;// Value assigned to primitive type
.
.NSNumber*numberObject=[NSNumbernumberWithInt:n];// Value object created from primitive type
.
.inty=[numberObjectintValue];// Encapsulated value obtained from value object (y == n)
.
绝大多数值类都可以通过声明初始化和类工厂方法来创建他们的实例。类工厂方法——为客户方便的实现类的实例化——联合了分配和初始化在一个步骤里并且返回创建的对象。举个例子,NSString类声明一个string类方法它分配并初始化了一个新的累的实例并且返回这个实例到你的代码。
.NSString*string=[NSStringstring];
.
除了创建之对象和让你访问他们封装的值之外,大多数的值类为简单的操作提供方法,例如对象比较。
Strings
字符串
Objective-C支持的字符串的约定和C一样:单一的字符用单引号括起来,字符串用双引号括起来。但是Objective-C框架通常不使用C字符串。他们使用NSString对象。
NSString类给字符串提供的对象封装方法,具有为存储任意长度的字符串提供内存管理、支持不同字符编码(特别是Unicode)、以及字符串格式化。因为你经常使用字符串,Objective-C提供一个简化符号来从不变值中创建NSString对象。。想要使用这个NSString文字,只要在双引号前加上“@”。如下面的例子所示:
.// Create the string "My String" plus carriage return.
.
.NSString*myString=@"My String\n";
.
.// Create the formatted string "1 String".
.
.NSString*anotherString=[NSStringstringWithFormat:@"%d %@",1,@"String"];
.
.// Create an Objective-C string from a C string.
.
.NSString*fromCString=[NSStringstringWithCString:"A C string"encoding:NSUTF8StringEncoding];
.
Numbers
Objective-C提供一个简化的符号用来创建NSNumber对象,代替需要调用初始化或类工厂方法来创建对象。只是在数值前加上符号@,并且跟着一个任意值,来创建NSNumber对象封装整型值和浮点值,如下代码所示:
.NSNumber*myIntValue= @32;
.
.NSNumber*myDoubleValue= @3.22346432;
.
你甚至可以封装布尔值和字符值
.NSNumber*myBoolValue= @YES;
.
.NSNumber*myCharValue=@'V';
.
你可以创建一个NSNumber对象来代表无符号整型、长整型、常常整型、以及浮点值通过在后面分别添加字幕U、L、LL、和F。例如,要创建一个NSNumber对象封装的浮点值,如下所示:
.NSNumber*myFloatValue= @3.2F
.
Collection Objects
集合对象
大多数Objective-C代码中的集合对象是一个基本集合类——NSArray,NSSet, 和NSDictionary.的实例。这些类被用在管理对象组,所以任何你想要添加到集合中的项目必须是一个Objective-C类的实例。如果你想添加一个标量值,你必须先创建一个合适的NSNumber或NSValue实例来表示它。
任何你添加到集合中的对象将在集合的生存期内生存。这是因为集合类使用强引用来跟踪它们的内容。除了跟踪它们的内容,每个集合类都很容易执行某些任务,例如枚举、访问特定对象、或者查找特定的对象是否是集合的一部分。
NSArray,NSSet, 和NSDictionary 这些类的内容在创建的的时候被设置。因为它们不能随意被改变,它们被称为不可变。它们每一个也拥有一个子类,叫做可变,允许你随时添加或移除对象。不同类型的结合组织对象的方式如下:
NSArray 和NSMutableArray— 数组是对象的有序集合。你能通过数组中指定的位置(就是索引)来访问对象。数组中的第一个元素索引是0(zero)。
NSSet 和NSMutableSet—集合储存一组无序的对象,每个对象只能出现一次。你通常通过应用测试或者过滤集合中的对象来访问集合中的对象。
NSDictionary 和NSMutableDictionary—字典将其条目以键-值对的方式存储;键是唯一的标识符,通常是一个字符串,而值是一个你想存储的对象。你通过键来访问对象。
Arrays
数组
数组(NSArray)是用来表示对象的有序表。唯一的要求是每一个项目必须是Objective-C的对象——没有要求每个对象是同一类的实例。
为了维持数组的有序性,每个元素都被储存在从零开始的索引中。
Creating Arrays
创建数组
在本章前面的关于值类描述中,你能通过分配和初始化、类工厂方法、或数组字面值来创建一个数组。
根据对象的数目,有多种不同的有效的初始化和工厂方法。
.+(id)arrayWithObject:(id)anObject;
.
.+(id)arrayWithObjects:(id)firstObject,...;
.
.-(id)initWithObjects:(id)firstObject,...;
.
因为arrayWithObjects和initWithObjects方法都以nil作为结束,可变参数,你必须以nil作为最后一个值。
.NSArray*someArray=
.
.[NSArrayarrayWithObjects:someObject,someString,someNumber,someValue,nil];
.
这个示例创建了一个像之前看到过的数组。第一个对象,someObject,将有一个数组索引0;最后一个对象,someValue,将有一个索引3。
它可能被无意的截断列表,如果其中一个值提供的是nil。
.idfirstObject=@"someString";
.
.idsecondObject=nil;
.
.idthirdObject=@"anotherString";
.
.NSArray*someArray=
.
.[NSArrayarrayWithObjects:firstObject,secondObject,thirdObject,nil];
.
在这个例子中,someArray仅包含firstObject,因为secondObject的值是nil,它中断了列表的项目。
It’s possible to create an array literal using a compact syntax.
.NSArray*someArray= @[firstObject,secondObject,thirdObject];
.
当使用这个语法,nil不会终止列表,nil是一个无效的值。举个例子,如果你尝试执行下面的代码,在运行时你会得到异常。
.idfirstObject=@"someString";
.
.idsecondObject=nil;
.
.NSArray*someArray= @[firstObject,secondObject];
.
.// exception: "attempt to insert nil object"
.
Querying Array Objects
查询数组对象
在你创建了一个数组后,你能查询它来获取信息——例如它有多少对象或者它是否包含给定的项目。
.NSUIntegernumberOfItems=[someArraycount];
.
.
.
.if([someArraycontainsObject:someString]){
.
....
.
.}
.
You can also query the array for an item at a given index. If you attempt to request an invalid index, you’ll get an out-of-bounds exception at runtime. To avoid getting an exception, always check the number of items first.你也可以根据给定索引来查询数组中的项目。如果你尝试请求一个无效索引,在运行时你将得到一个 out-of-bounds的异常。为了避免异常,总是事先检查项目的数量。
.if([someArraycount]>0){
.
.NSLog(@"First item is: %@",[someArrayobjectAtIndex:0]);
.
.}
.
这个例子检查是否项目数量超过零。如果是,则FoundationNSLog函数记录第一个项目的描述,它有一个索引号,0。
作为objectAtIndex:的替代方法,你也能使用下标的语法来查询数组,这种方法就像标准的C数组。之前的例子也能改写如下:
.if([someArraycount]>0){
.
.NSLog(@"First item is: %@",someArray[0]);
.
.}
.
Sorting Array Objects
数组对象排序
NSArray类提供了各种各样的方法来排序它集合的对象。因为NSArray是不可变的,所有的方法都返回一个新的包含排序的数组。
举个例子,你能通过调用compare:来为字符串数组进行排序。
.NSArray*unsortedStrings= @[@"gammaString",@"alphaString",@"betaString"];
.
.NSArray*sortedStrings=
.
.[unsortedStringssortedArrayUsingSelector:@selector(compare:)];
.
Mutability
可变的
尽管NSArray类自身是不可变的,但它能包含可变对象。举个例子,如果你添加一个可变字符串数组到不可变数组,如下所示:
.NSMutableString*mutableString=[NSMutableStringstringWithString:@"Hello"];
.
.NSArray*immutableArray= @[mutableString];
.
没有什么能阻止你改变字符串。
.if([immutableArraycount]>0){
.
.idstring=immutableArray[0];
.
.if([stringisKindOfClass:[NSMutableStringclass]]){
.
.[stringappendString:@" World!"];
.
.}
.
.}
.
如果你想在初始化创建后,从数组中移除对象,需要使用NSMutableArray,它增加了各种方法来添加、移除、或者替换一个或多个对象。
.NSMutableArray*mutableArray=[NSMutableArrayarray];
.
.[mutableArrayaddObject:@"gamma"];
.
.[mutableArrayaddObject:@"alpha"];
.
.[mutableArrayaddObject:@"beta"];
.
.
.
.[mutableArrayreplaceObjectAtIndex:0withObject:@"epsilon"];
.
这个例子创建了一个由对象@"epsilon",@"alpha", 和@"beta"组成的数组。
也可以给可变数组排序,而不需要创建第二个数组。
.[mutableArraysortUsingSelector:@selector(caseInsensitiveCompare:)];
.
在这种情况下,包含的项目按照升序、不分大小写排序,@"alpha",@"beta", 和@"epsilon"。
Sets
集合
一个集合(NSSet)对象与数组类似,但它保持无序状态且每组的对象必须不同。
因为集合没有排序,所以当它进行成员调试时,能提供比数组更快的性能。
因为基本NSSet类不可变,它的内容必须是在创建的时候指定,使用分配并初始化方法或类工厂方法都可以。
.NSSet*simpleSet=
.
.[NSSetsetWithObjects:@"Hello, World!", @42,aValue,anObject,nil];
.
和NSArray一样,initWithObjects: 和setWithObjects方法都以结尾,参数数量可变。NSSet的可变子类名为NSMutableSet。
集合只存储特定的对象一次,即使你多次尝试也是如此。
.NSNumber*number= @42;
.
.NSSet*numberSet=
.
.[NSSetsetWithObjects:number,number,number,number,nil];
.
.// numberSet only contains one object
.
Dictionaries
字典
不同于简单的排序或不排序对象的集合,字典 (NSDictionary) 通过给定的键来存储有关联的对象,键可以被用作检索。
最好是使用字符串对象作为字典的键。
虽然你能用其他对象作为键,但是要为字典记住每一个键且必须支持NSCopying。但是,如果你想使用键-值编码,你必须为字典对象使用字符串键(要学习更多,详见Key-Value Coding Programming Guide))。
Creating Dictionaries
创建字典
你能使用分配初始化以及类工厂方法来常见字典,如下所示:
.NSDictionary*dictionary=[NSDictionarydictionaryWithObjectsAndKeys:
.
.someObject,@"anObject",
.
.@"Hello, World!",@"helloString",
.
. @42,@"magicNumber",
.
.someValue,@"aValue",
.
.nil];
.
作为dictionaryWithObjectsAndKeys: 和initWithObjectsAndKeys:方法,每个对象在它的键之前被指明,并且对象和键的列表最后要以nil结尾。
Objective-C提供了一个简单语法来创建字典。
.NSDictionary*dictionary= @{
.
.@"anObject":someObject,
.
.@"helloString":@"Hello, World!",
.
.@"magicNumber": @42,
.
.@"aValue":someValue
.
.};
.
作为字典字面量,键在对象之前被指定,并且列表结尾没有nil。
Querying Dictionaries
查询字典
在你创建字典之后,你能要求他找到给定键的所存储的对象。
.NSNumber*storedNumber=[dictionaryobjectForKey:@"magicNumber"];
.
如果对象没有找到,objectForKey方法返回nil。
.这儿也可以使用下标法来代替objectForKey:
.NSNumber*storedNumber=dictionary[@"magicNumber"];
.
Mutability
可变
如果你想从创建好的字典中添加或者移除对象,需要使用NSMutableDictionary子类。
.[dictionarysetObject:@"another string"forKey:@"secondString"];
.
.[dictionaryremoveObjectForKey:@"anObject"];
.
Represent nil with NSNull
用NSNull表示nil
不可能添加nil到集合类,因为nil在Objective-C中意思是“没有对象。”如果你想在集合中表示“没有对象”,要使用NSNull类。
.NSArray*array= @[@"string", @42,[NSNullnull]];
.
对于NSNull,null方法总是返回相同的实例。有这种行为的类被称为单例类(singleton classes)。你能检查数组中的对象是否等于共享的NSNull实例,如下所示:
.for(idobjectinarray){
.
.if(object==[NSNullnull]){
.
.NSLog(@"Found a null object");
.
.}
.
.}
.
尽管Foundation框架包含比这里描述的更多的功能,你也不是必须要了解每一个细节。如果你想要学习更多的关于Foundation的内容,参看Foundation Framework Reference。现在,你已经有足够的信息来继续实现ToDoList app,你将会同伙编写自定义数据类来做到这一点。
Using Design Patterns
Writing a Custom Class
Copyright 2014 Apple Inc. All rights reserved. Terms of Use | Privacy Policy | Updated: 2013-10-22
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流