[学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十五章 数字 字符串和集合
来源:互联网 发布:sql2008软件下载 编辑:程序博客网 时间:2024/04/19 14:14
第十三章主要讲解C语言的语法,书中作者不提倡第一次阅读本书时阅读,故略过。
第十四章介绍Foundation框架,内容比较少,也就此略过。
Part 1. 数字对象
基本的数据类型不是对象,因此不能给他们发信息。但是有的时候需要将这些值作为对象使用:NSArry创建的数组存储的值必须是对象,因此数据类型无法直接存储到数组中,需要NSNumber类,依据数据的类型创建对象。
NSNumber类:每种基本数据类型,NSNumber的类方法都能为它创建一个NSNumber对象。
NSNumber *myNumber, *floatNumber, *intNumber; //NSNumber对象 NSInteger myInt; //NSInteger:基本数据类型的typedef(64位long或者32为int) //创建integer 整型 intNumber = [NSNumber numberWithInteger:100]; myInt = [intNumber integerValue];//获取存储在intNumber中的整型值 NSLog(@"%li", (long)myInt); //将myInt转换为long型 //创建long 型值 myNumber = [NSNumber numberWithLong:0xabcdf]; NSLog(@"%lx", [myNumber longValue]); //创建char 型值 myNumber = [NSNumber numberWithChar:'X']; NSLog(@"%c", [myNumber charValue]); //创建float 型值 floatNumber = [NSNumber numberWithFloat:100.00]; NSLog(@"%g", [floatNumber floatValue]); //创建double 型值 myNumber = [NSNumber numberWithDouble:12345e+15]; NSLog(@"%lg", [myNumber doubleValue]); //发生错误:存储的类型和提取的类型应该一致 NSLog(@"%li", (long) [myNumber integerValue]); //验证两个number是否相等 if ([intNumber isEqualToNumber:floatNumber] == YES) NSLog(@"Numbers are equal"); else NSLog(@"Numbers are not equal"); //验证一个Number是否小于,等于,或大于另一个Number if ([intNumber compare:myNumber] == NSOrderedAscending) NSLog(@"First number is less than second"); //相等:NSOrderdSame //大于:NSOrderdDescending
注意:不能修改前面创建的NSNumber的值:所有数字对象都必须是新创建的。
- 对NSNumber类调用numberWith方法
- 对alloc方法的结果调用initWith方法
通过@表达式创建数字对象
NSNumber *myNumber, *floatNumber, *intNumber; NSInteger myInt; //整型 integer intNumber = @100; myInt = [intNumber integerValue]; NSLog(@"%li", (long) myInt); //长整型long value myNumber = @0xabcdefL; NSLog(@"%lx", [myNumber longValue]); myNumber = @'X'; NSLog(@"%c", [myNumber charValue]); //浮点型 floatNumber = @100.0f; NSLog(@"%g", [floatNumber floatValue]);
Part 2. 字符串对象
Part 2.1 NSLog函数
//常量字符串对象 Programming is fun 被赋值给NSString变量str NSString *str = @"Programming is fun"; NSLog(@"%@",str);
Part 2.2 可变对象与不可变对象
- 处理不可变对象
NSString *str1 = @"This is string A"; //常量字符串对象 指向了内存中的某处字符串对象 NSString *str2 = @"This is string B"; //常量字符串 NSString *res; NSComparisonResult compareResult; //保存结果 //将一个字符串赋复制到另一个字符串 res = [NSString stringWithString:str1]; //str1 赋值给res,字符串内容的复制,产生新的字符串,str1和res指向两个不同的字符串对象;而res=str1:同一对象的另一个引用 //将一个字符串复制到另一个字符串的末尾 str2 = [str1 stringByAppendingString:str2]; //产生新的字符串对象,原字符串对象str1和str2没有被更改:因为是不可变字符串对象 //将字符串转换为大写 res = [str1 uppercaseString]; //res指向新字符串对象(大写),str1仍然指向原来的字符串对象 //字符串转换为小写 res = [str1 lowercaseString]; //原来的大写字符不再被引用。小写字符串的引用存在res中
NSString *str1 = @"This is string A"; NSString *str2 = @"This is string B"; NSString *res; NSRange subRange;//subRange是结构变量 //从字符串中提取前三个字符 res = [str1 substringToIndex:3];//创建一个子字符串,首字符到指定的索引数。0,1,2 NSLog(@"First 3 chars of str1: %@", res); //提取从索引5开始直到结尾的子字符串 res = [str1 substringFromIndex:5];//返回一个子字符串,指定索引字符到字符串结尾 //提取从索引8开始到索引13的字符串(6个字符:13-8+1 = 6) res = [ [str1 substringFromIndex:8] substringToIndex:6]; NSLog(@"Chars from index 8 through 13: %@", res); //更简单的方法 res = [str1 substringWithRange: NSMakeRange(8, 6)]; NSLog(@"Chars from index 8 through 13: %@",res); //从另一个字符串中查找一个字符串 subRange = [str1 rangeOfString: @"string A"]; NSLog(@"String is at index %lu, lenth is %lu", subRange.location, subRange.length);//结构成员操作符:(.)
- 可变字符串
NSString *str1 = @"This is string A"; NSString *search, *replace; NSMutableString *mstr; //用来存储在程序执行过程中值可能更改的字符串对象 NSRange substr; //从不可变字符串创建可变字符串 mstr = [NSMutableString stringWithString: str1]; //返回可变的字符串对象 //插入字符 [mstr insertString:@" mutable" atIndex:7]; //插入末尾进行有效拼接 [mstr insertString:@" and string B" atIndex:[mstr length]]; //直接在末尾添加 [mstr appendString:@" and string C"]; //根据范围范围删除子字符串 从索引数16开始删除13个字符。 [mstr deleteCharactersInRange: NSMakeRange(16, 13)]; //查找然后将其删除 substr = [mstr rangeOfString:@"string B and "]; if (substr.location != NSNotFound){ [mstr deleteCharactersInRange:substr]; NSLog(@"%@", mstr); } //直接设置为可变的字符串 [mstr setString:@"This is string A"]; NSLog(@"%@", mstr); //替换一些字符 [mstr replaceCharactersInRange:NSMakeRange(8, 8) withString:@"a mutable string"]; //查找和替换 search = @"This is"; replace = @"An example of"; substr = [mstr rangeOfString:search]; if (substr.location != NSNotFound){ [mstr replaceCharactersInRange:substr withString:replace]; NSLog(@"%@",mstr); } //查找和替换所有的匹配项 search = @"a"; replace = @"X"; substr = [mstr rangeOfString:search]; while (substr.location != NSNotFound) { [mstr replaceCharactersInRange:substr withString:replace]; substr = [mstr rangeOfString:search]; } NSLog(@"%@", mstr);
Part 3. 数组对象
不可变数组:NSArray
可变数组:NSMutableArray
int main(int argc, const char * argv[]) { int i; @autoreleasepool { //创造和返回一个数组 : arrayWithObjects NSArray *monthNames = [ NSArray arrayWithObjects: @"January", @"February", @"March", @"April", @"May",@"June",@"July",@"August",@"September",@"October", @"November", @"December", nil]; //12个字符串,索引从0开始 0~11 //列出数组中所有的元素 NSLog(@"Month Name"); NSLog(@"===== ===="); for (i = 0; i < 12; ++i) NSLog(@"%2i %@", i+1, [monthNames objectAtIndex:i]); // objectAtIndex:索引元素 } return 0;}
- 简单创建NSArray对象:
//创建NSArray对象@[elem1, elem2, ... elemn];//引用数组元素array [index]; //等价于:[array objectAtIndex: index]//将对象的引用存储到数组中array [index] = object; //等价于:[array setObject: object forIndex: index]
- 创建一个包含各月份的数组
int main(int argc, const char * argv[]) { int i; @autoreleasepool { //创建一个包含各月份名称的数组 NSArray *monthNames = @[ @"January", @"February", @"March", @"April", @"May", @"June", @"July",@"August",@"September",@"October", @"November", @"December"]; //列出数组中的所有元素 NSLog(@"Month Name"); NSLog(@"===== ===="); for (i = 0; i<12; ++i) { NSLog(@" %2i %@", i+1, monthNames[i]); } } return 0;}
- 数字对象的数组
NSMutableArray *numbers = [NSMutableArray array]; //创建空的可变数组对象,数组元素的个数并未指定 int i; //创建0~9数字的数组 for (i = 0; i < 10; ++i) { numbers[i] = @(i); //在数组末尾添加一个对象:[numbers addObject: @(i)]; } //显示数组每个元素的值 for (i = 0; i < 10; ++i) { NSLog(@"%@", numbers[i]); } //使带有%@格式的NSLog显示 NSLog(@"====== Using a single NSLog"); NSLog(@"%@", numbers);
- 地址簿实例:
一个可以进行添加,删除,搜索,排序地址卡片(姓名+邮件)的地址簿
AddressCard.h
#import <Foundation/Foundation.h>@interface AddressCard : NSObject@property (copy, nonatomic) NSString *name, *email;-(void) setName:(NSString *) theName andEmail: (NSString *) theEmail; //设置名字,邮件(字符串)-(void) print; //打印名片-(NSComparisonResult) compareNames: (id) element;//比较两个字符串@end
AddressCard.m
#import "AddressCard.h"@implementation AddressCard@synthesize name, email;-(void) setName:(NSString *) theName andEmail: (NSString *) theEmail{ self.name = theName; self.email = theEmail;}-(NSComparisonResult) compareNames: (id) element{ return [name compare: [element name]];//两个字符串的比较,返回比较结果}-(void) print { NSLog(@"=============================="); NSLog(@"| |"); NSLog(@"| %-31s |", [name UTF8String]); NSLog(@"| %-31s |", [email UTF8String]); NSLog(@"| |"); NSLog(@"==============================");}@end
AddressBook.h
#import <Foundation/Foundation.h>#import "AddressCard.h"@interface AddressBook : NSObject@property (nonatomic, copy) NSString *bookName;@property (nonatomic, strong) NSMutableArray *book;-(instancetype) initWithName: (NSString *) name; //设置初始数组-(void) addCard: (AddressCard *) theCard; //向地址簿添加名片-(void) removeCard: (AddressCard *) theCard;//向地址簿移除名片-(AddressCard *) lookup: (NSString *) theName; //查找名片-(int) entries; //获取名片的数量-(void) list; //显示地址簿的全部内容-(void) sort; //排序地址簿中的名片@end
AddressBook.m
#import "AddressBook.h"@implementation AddressBook@synthesize bookName, book;//设置addressbook的名称和一个空的addressbook-(instancetype) initWithName:(NSString *)name //返回值类型定义为:一般的对象类型{ if (self) { bookName = [ NSString stringWithString:name ];//将方法参数传递过来的字符串复制一份存储在实例变量bookName中 book = [ NSMutableArray array ];//再创建一个空的NSMutableArray对象赋值给book } return self;}-(instancetype) init{ return [self initWithName:@"NoName"];}-(void) addCard:(AddressCard *)theCard //将AdrressCard作为参数,添加到地址簿中{ [book addObject: theCard];}-(void) removeCard: (AddressCard *) theCard{ [book removeObjectIdenticalTo: theCard];}-(int) entries //返回地址簿中存储的地址卡片数目{ return [book count]; //count方法返回数组元素的个数;}-(void) list{ NSLog(@"========== Contents of: %@ =========", bookName); for ( AddressCard *theCard in book) //book数组的每个元素序列使用快速枚举技术 NSLog(@"%-20s %-32s", [theCard.name UTF8String],[theCard.email UTF8String]); NSLog(@"=======================================================");}-(void) sort{ [book sortUsingSelector:@selector(compareNames:)]; //sortUsingSelector:比较数组中的两个元素}-(AddressCard *) lookup: (NSString *) theName{ for (AddressCard *nextCard in book) //快速枚举 if ( [nextCard.name caseInsensitiveCompare: theName] == NSOrderedSame) return nextCard; return nil;}@end
main:
#import <Foundation/Foundation.h>#import "AddressBook.h"#import "AddressCard.h"int main(int argc, const char * argv[]) { @autoreleasepool { NSString *aName = @"Julia"; NSString *aEmail = @"julia@gmail.com"; NSString *bName = @"Tony"; NSString *bEmail = @"tony@gmail.com"; NSString *cName = @"Stephen"; NSString *cEmail = @"steve@gmail.com"; NSString *dName = @"Jamie"; NSString *dEmail = @"jamie@gmail.com"; AddressCard *card1 = [[AddressCard alloc] init]; AddressCard *card2 = [[AddressCard alloc] init]; AddressCard *card3 = [[AddressCard alloc] init]; AddressCard *card4 = [[AddressCard alloc] init]; //创建一个新的地址簿 AddressBook *myBook = [[AddressBook alloc] initWithName:@"Linda's Address Book " ]; AddressCard *myCard; //创建四个卡片 [card1 setName:aName andEmail:aEmail]; [card2 setName:bName andEmail:bEmail]; [card3 setName:cName andEmail:cEmail]; [card4 setName:dName andEmail:dEmail]; //将地址卡片添加到地址簿 [myBook addCard:card1]; [myBook addCard:card2]; [myBook addCard:card3]; [myBook addCard:card4]; //列出未排序的地址簿 [myBook list]; //进行排序并在此列出 [myBook sort]; [myBook list]; //通过名字查找一个 NSLog(@"Lookup : Stephen:"); myCard = [myBook lookup: @"Stephen"]; if (myCard != nil) { [myCard print]; } else NSLog(@"Not Found!"); //从电话簿中删除条目 [myBook removeCard:myCard]; [myBook list]; } return 0;}
Part 4. 词典对象
- 词典:键—对象对组成的数据集合,通过对象的键从词典中获取对象。和键关联的值可以是任何类型,但不能使nil。
- 词典可以固定,可以可变:动态添加和删除,使用键检索词典,可以枚举内容。
NSMutableDictionary *glossary = [ NSMutableDictionary dictionary];//创建空的可变词典 //存储一个条目在类别中 [glossary setObject:@"A class defined so other classes can inherit from it" forKey:@"abstract class"]; //检索并显示 NSLog(@"abstract class: %@", [glossary objectForKey:@"abstract class"]) //[dict objectForKey: key] 等同于 dict[ key ] //[dict setObject: object forKey: key] 等同于: dict[key] = object
- 枚举词典
//创建对象-键对的数组 NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys: @"A class defined so other classes can inherit from it", @"abstract class", @"To implement all the methods defined in a protocol", @"adopt", @"Storing an object for later use", @"achiving", nil]; for (NSString *key in glossary) //枚举 NSLog(@"%@:%@", key, [glossary objectForKey:key]);
Part 5. 集合对象
- set:单值对象集合
- 可变,不可变
- 搜索,添加,删除集合中的成员,比较两个集合,计算两个集合的交集和并集
NSMutableSet *set1 = [NSMutableSet setWithObjects: @1, @3, @5, @10, nil]; NSSet *set2 = [NSSet setWithObjects: @-5, @100, @3, @5, nil]; NSSet *set3 = [NSSet setWithObjects: @12, @200, @3, nil]; NSLog(@"set1:"); [set1 print]; NSLog(@"set2:"); [set2 print]; //相等性测试 if ([set1 isEqualTo:set2] == YES) { NSLog(@"set1 equals set2"); } else { NSLog(@"set1 is not equat to set2"); } //成员测试 if ([set1 containsObject:@10]) { NSLog(@"set1 contains 10"); } else { NSLog(@"set1 does to contain set2"); } if ([set2 containsObject:@10]) { NSLog(@"set2 contains 10"); } else { NSLog(@"set2 does to contain set2"); } //在可变集合set1中添加和移除对象 [set1 addObject:@4]; [set1 removeObject:@10]; NSLog(@"set1 after adding 4 and removing 10:"); [set1 print]; //获得两个集合的交集 [set1 intersectSet:set2]; NSLog(@"set1 inserct set2: "); [set1 print]; //获得两个集合的并集 [set1 unionSet:set3]; NSLog(@"set1 union set3: "); [set1 print];
0 0
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十五章 数字 字符串和集合
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第四章 数据类型和表达式
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十章 变量和数据类型
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十一章 分类和协议
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之15-数字、字符串和集合——黑马 IOS 技术博客
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第六章 选择结构
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第七章 类
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第八章 继承
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十二章 预处理程序
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十八章 复制对象
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第三章 类,对象和方法
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第四章 数据类型和表达式 课后练习题 4-10
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第九章 多态,动态类型和动态绑定
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十七章 内存管理和自动计数
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》开始
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第七章 类 课后题 7-6 解析
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第五章 循环结构 部分例题&课后题讲解
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第三章 类,对象和方法 课后题解析 3-7
- 【优秀网址汇总】
- 运用指针复制的方法,输出用户自定义输入的字符串
- rm -rf惹的祸,未雨绸缪,防止数据丢失
- Android Dalvik模式下劫持 Java 函数
- iOS8 UILocalNotification 增加启动授权
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十五章 数字 字符串和集合
- archlinux修改dconf配置文件
- Android DiskLruCache完全解析
- RubyGem默认源安装太慢,修改国内淘宝源
- Codeforces Round #289 (Div. 2, ACM ICPC Rules) F. Progress Monitoring 区间dp
- Csharp学习第三天
- iOS动力学UIDynamic讲解(二)
- Android入门(38)——第十五章 Android布局优化
- 2015网络安全大会-下