热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(译)GettingStarted——1.3.3WorkingwithFoundation(使用Foundation框架)

在你使用Objective-C语言开发应用时,你会发现在开发中,你会用到很多框架。尤其是Foundation框架,该框架为应用提供了最基础

    在你使用Objective-C语言开发应用时,你会发现在开发中,你会用到很多框架。尤其是Foundation框架,该框架为应用提供了最基础的服务。Foundation框架包括了代表着基本数据类型的value类,例如字符串,数值,它也包括了用于存储其它对象的collection类。在ToDoList应用中,你将应用value和collection类来编写代码。

value类

    Foundation框架提供了用于生成字符类型、二进行类型、时间类型、数字类型、其它类型的工具类。

    value对象封装了一个原始值(C数据类型),并提供该值的相关服务。在应用中,当你调用方法时,你经常会遇到value对象,比如方法的参数,或返回值。框架的不同部分——甚至不同的框架——之间,都可以通过传递这些value对象来完成数据交换的目的。

    在Foundation框架中value对象的部分示例:

    NSString,NSMutableString

    NSData,NSMutableData

    NSDate

    NSNumber

    NSValue

    因为value对象代表了标量值,因此,你可以在集合或其它对象需要的任何地方,都可以使用它们。value对象优于由它们封装的基本类型:它们让你在基于封装的值上进行的操作变得简单和有效。例如,NSString类有搜索字符串和替换子串的方法,有给文件或URL添加字符串的方法,还有构建文件系统路径的方法。

    你可以利用基本类型来创建value对象。例如,NSNumber就提供了类似的方法:

  1. int = 5// Value assigned to primitive type

  2. NSNumber *numberObject = [NSNumber numberWithInt:n]; // Value object created from primitive type

    随后,你可以获取到包装到对象里的数据:

  1. int = [numberObject intValue]; // Encapsulated value obtained from value object (y == n)

    大多数的value类通过初始化或类构建方法的方式来申明它们的实例。类构造方法——由类来实现,作为客户端的约定——把分配和初始化结合在一起,最后返回要创建的对象。例如,NSString类申明了一个返回类型为string的类方法,它已经申请和实例化了一个新的类实例。

  1. NSString *string = [NSString string];   

    除了创建value对象和获取被封装的值,大多数的value类都提供了简化操作的方法,例如,对象比较等。

字符串

    对于字符串来说,Objective-C和C支持相同的约定:单个字符用单引号,多个字符用双引号。但是,Objective-C框架不使用C字符,用的是NSString对象。

    NSString类提供了字符的对象包装方法,提供了内建的任意长度字符串的内存管理,提供了不同的字符编码(尤其是Unicode),还为格式化字符提供了工具集。对于使用频度很高的字符串来说,Objective-C为创建NSString对象的常量值提供了快捷的方法。要使用NSString的字面值,只要在用双引号括起的字符串前面添加@就可以了,如下所示:

  1. // Create the string "My String" plus newline.

  2. NSString *myString = @"My String\n";

  3. // Create the formatted string "1 String".

  4. NSString *anotherString = [NSString stringWithFormat:@"%d %@"1@"String"];

  5. // Create an Objective-C string from a C string.

  6. NSString *fromCString = [NSString stringWithCString:"A C string" encoding:NSUTF8StringEncoding];

数值

    Objective-C提供了快捷的创建NSNumber对象的方法,不需要调用初始化或类的构建方法就可以创建NSNumber对象。只要在数字前面添加@符号就行。例如,你可以这样创建整形或双精度类型的对象:

  1. NSNumber *myIntValue    = @32;

  2. NSNumber *myDoubleValue = @3.22346432;

     

    你甚至可以使用Boolean类型和字符类型的值来创建NSNumber对象:

  1. NSNumber *myBoolValue = @YES;

  2. NSNumber *myCharValue = @'V';

    你可以创建NSNumber来表示unsigned integers,long integers,long long integers和float values,只需要在数字后相应添加U,L,LL和F。例如,要创建一个浮点类型的值,你可以这样:

  1. NSNumber *myFloatValue = @3.2F;

集合对象

    Objective-C中的大多数集合对象都是基本集合类:NSArray、NSSet和NSDictionary类的实例。集合类的被用来管理一组对象,因此,给集合添加的任一元素都必须是Objective-C类的实例。如果你需要给集合添加数字值,你必须先把它转换为合适的NSNumber或NSValue类型的对象,然后再把对象添加到集合中。

    只要集合存在,集合中的任一对象都存在,这是因为集合类在保存集合内的元素时,使用的是强引用。除了保存集合内元素的强引用之外,每个集合类还有一些便于某些特殊任务操作的执行方法,例如,枚举,获取特定元素,找出某个对象是否是集合的一部分等等。

    NSArray、NSSet和NSDictionary类的内容是集合。因为随着时间的推移,它们的内容不能发生变化,因此,这些类被称为不可变的。这三个类都有可变化的子类,这些子类可以随时添加或删除对象。不同类型的集合以独特的方式组织集合内的对象:

    NSArray和NSMutableArray:这两种数组中的对象都是有序的。可以通过位置(即索引)获取数组中的对象。数组中的首个元素的索引是0。

    NSSet和NSMutableSet:存储无序对象的集合,集合中的对象不重复。在该类集合中,一般使用测试或过滤的方式来获取元素。

    NSDictionary和NSMutableDictionary:字典中存储的是键值对实体。键是实体的唯一标识,一般是字符串类型,值是对象类型。通过键值来获取数据。

Array

    数组代表了有序对象的集合。唯一的要求是数组中的每个元素都必须是Objective-C中的对象类型——数组中每个元素的类型可以不一样。

    为了维持数组的有序性,数组里的元素都有索引来标识,索引是从0开始的。

创建数组

    通过初始化或类构造方法来创建数组。有一系列不同的初始化和类构造方法可以使用,具体使用哪个方法依赖于对象的数量:

  1. + (id)arrayWithObject:(id)anObject;

  2. + (id)arrayWithObjects:(id)firstObject...;

  3. (id)initWithObjects:(id)firstObject...;

    因为arrayWithObjects和initWithObjects方法都以nil作为参数的中止,因此,必须包含nil:

  1. id firstObject = @"someString";

  2. id secondObject = @"secondString";

  3. id thirdObject = @"anotherString";

  4. NSArray *someArray =

  5. [NSArray arrayWithObjects:firstObjectsecondObjectthirdObjectnil];

    上面的例子中,使用三个对象创建了一个数组。第一个元素:firstObject的索引是0;最后一个对象:thirdObject的索引是2.

    也可以使用紧凑的语法来创建数组:

  1. NSArray *someArray = @[firstObjectsecondObjectthirdObject];

    在使用紧凑的语法创建数组时,最后一个元素不能是nil——事实上,nil是个无用的值。例如,如果你执行下面的代码,那么在运行时,你会获得一个异常:

  1. id nilObject = nil;

  2. NSArray *someArray = @[firstObjectnilObject];

  3. // exception: "attempt to insert nil object"

查询数组对象

    数组被创建后,你可以对数组进行查询——例如,数组中的元素个数,或者数组中是否包含某个元素等。

  1. NSUInteger numberOfItems = [someArray count];

  2.  

  3. if ([someArray containsObject:secondObject]) {

  4.    ...

  5. }

    你还可以使用索引来查询数组元素。如果你尝试使用一个不存在的索引来查询数组元素,那么在运行时,你会获取数取越界的异常。为了避免这个异常,在根据索引进行查询前,应该都做个检查:

  1. if ([someArray count0{

  2.    NSLog(@"First item is: %@"[someArray objectAtIndex:0]);

  3. }

    上面代码检查的是数组中是否有元素。如果有,Foundation框架里的NSLog类就会把索引0位置的元素打印出来。

    有个方法与objectAtIndex的方法作用相同,它获取元素的方式更类似于标准C数组获取元素的方式。前面的代码可以改为下面这个样子:

  1. if ([someArray count0{

  2.    NSLog(@"First item is: %@"someArray[0]);

  3. }

使用数组存储对象

    NSArray类提供了许多用于存储对象的方法。因为NSArray类型的数组是不可变的,因此,每个方法都以存储时的顺序返回了一个新的数组。

    例如,你可以使用compare方法对数组里的字符进行分类:

  1. NSArray *unsortedStrings = @[@"gamma"@"alpha"@"beta"];

  2. NSArray *sortedStrings =

  3.         [unsortedStrings sortedArrayUsingSelector:@selector(compare:)];

可变数组

    尽管数组类的本身是不可变的,然而,它也可以包含可变的对象。例如,你可以这样创建包含可变字符的不可变数组:

  1. NSMutableString *mutableString = [NSMutableString stringWithString:@"Hello"];

  2. NSArray *immutableArray = @[mutableString];

    没有什么可以阻止你来改变字符:

  1. if ([immutableArray count0{

  2.    id string = immutableArray[0];

  3.    if ([string isKindOfClass:[NSMutableString class]]) {

  4.        [string appendString:@" World!"];

  5.    }

  6. }

    在初始化操作后,如果你想从数组中添加或移除对象,请使用NSMutableArray类,使用该类,你可以添加、删除、替换任意数量的对象:

  1. NSMutableArray *mutableArray = [NSMutableArray array];

  2. [mutableArray addObject:@"gamma"];

  3. [mutableArray addObject:@"alpha"];

  4. [mutableArray addObject:@"beta"];

  5.  

  6. [mutableArray replaceObjectAtIndex:withObject:@"epsilon"];

    以上的代码创建了一个由@"epsilon",@"alpha"和@"beta"三个对象构成的数组。

    也可以不用创建第二个数组就对一个可变数组中的元素进行分类:

  1. [mutableArray sortUsingSelector:@selector(caseInsensitiveCompare:)];

    在上述代码的情况下,使用升序、不区分大小写的方式对数组中的元素进行了分类,结果是:@"alpha",@"beta",@"epsilon"。

Set

    set(NSSet)对象与数组类似,但是它保存的是一组无序的、唯一的对象。

    因为set中的元素没有顺序,因此,当在两个集合中使用测试方法时,set比array的效率高。

    因为基础的NSSet类是不可变的,所以,在创建时,它里面的内容就必须被指定,创建可以使用初始化或类构造器的方法。

 

  1. NSSet *simpleSet =

  2.  [NSSet setWithObjects:@"Hello, World!"@42aValueanObjectnil];

    与NSArrary一样,initWithObjects和setWithObjects方法都需要nil参数。

    在set中,即使你把同一元素添加多次,set也只会保存一次引用。

  1. NSNumber *number = @42;

  2.    NSSet *numberSet =

  3.      [NSSet setWithObjects:numbernumbernumbernumbernil];

  4.    // numberSet only contains one object

Dictionary

    字典里的数据不是有序或无序那么简单,字典里存储的数据都有键,键可以用来检索数据。

    最佳实践是使用字符串类型的键。

    尽管键的类型也可以使用其它的对象类型,但是你应该明白:键是被复制使用的,因此,键必须支持NSCopying。但是,如果你想使用键-值对方式的编码,你必须为字典对象使用字符串类型的键。更多的知识可以参见Key-Value Coding Programming Guide章节。

创建字典

    可以通过初始化或使用类构造方法来创建字典:

  1. NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:

  2.               someObject@"anObject",

  3.         @"Hello, World!"@"helloString",

  4.                      @42@"magicNumber",

  5.                someValue@"aValue",

  6.                      nil];

    对于dictionaryWithObjectsAndKeys和initWithObjectsAndKeys这两个方法来说,先指定对象,后指定键,并且,最后以nil结尾。

    Objective-C提供了创建字典的简捷语法:

  1. NSDictionary *dictionary = @{

  2.              @"anObject" someObject,

  3.           @"helloString" @"Hello, World!",

  4.           @"magicNumber" @42,

  5.                @"aValue" someValue

  6. };

    在上面的表达式中,先指定键,后指定对象,并且,最后不以nil结尾。

查询字典

    字典创建后,可以根据指定的键在字典中查询对象:

  1. NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];

    如果对象没有找到,objectForKey方法将返回nil。

    有一个下标语法的功能与objectForKey方法的功能相同:

  1. NSNumber *storedNumber = dictionary[@"magicNumber"];

可变字典

    在字典创建后,如果你需要给字典添加或移除对象,那你应该使用NSMutableDictionary:

  1. [dictionary setObject:@"another string" forKey:@"secondString"];

  2. [dictionary removeObjectForKey:@"anObject"];

使用NSNull来表示nil

    从上面的描述中就可以知道,不能在集合类中添加nil,这是因为Objective-C中nil意味着“no object”(没有对象)。你如果需要在集合中表示没有对象,请使用NSNull类:

  1. NSArray *array = @@"string"@42[NSNull null];

    NSNull的null方法总会返回同样的实例,总会返回同样实例的类被称为单例类。你可以使用下面的方法来检查数组中的某个对象是否为NSNull类的实例:

  1. for (id object in array{

  2.    if (object == [NSNull null]) {

  3.        NSLog(@"Found a null object");

  4.    }

  5. }

    尽管Foundation框架里包含的能力远远多于上述描述的能力,但是,你确实不需要马上就知道每个能力的细节。如果你想学习更多foundation框架的知识,请参见Foundation Framework Reference章节。到目前为止,你已经有足够的能力来继续开发ToDoList应用了,下面章节的内容就是开发一个自定义的数据类。

 

转:https://www.cnblogs.com/wchhuangya/p/4600687.html



推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
author-avatar
能然然520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有