数字、字符串和集合
数字对象
基本数据类型都不是对象,也就是说不能向他们发送消息。
int、NSInteger的区别
NSInteger会自动识别当前电脑系统是32位还是64位数,然后自动返回最大的类型(int还是NSInteger)。
例如,当前电脑为32位系统,你声明的NSInteger自动变为int。当前电脑为64位系统,你声明的NSInteger还是NSInteger。
备注:在多数情况下一定尽可能的使用NSInteger
NSInteger、NSUInteger的区别
NSInteger是有符号整形,即声明的变量既可以是正数也可以是负数。
NSUInteger是无符号整形,即声明的变量只能是正数,比如取值数组下标,可以使用来声明NSUInteger。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"这是一个测试数字对象的程序...");
NSNumber *myNumber, *floatNumber, *intNumber;
NSInteger myInt;
// integer 型值
intNumber = [NSNumber numberWithInteger:100];//表示创建一个值为100的整数对象
myInt = [intNumber integerValue];//获取储存在intNumber中的整形值,将她储存在NSInteger变量myInt中
NSLog(@"%li",(long)myInt);
// long 值
myNumber = [NSNumber numberWithLong:0xabcdef];
NSLog(@"%lx",[myNumber longValue]);
//char 值
myNumber = [NSNumber numberWithChar:'X'];
NSLog(@"%c",[myNumber charValue]);
// float 值
floatNumber = [NSNumber numberWithFloat:100.00];
NSLog(@"%f",[floatNumber floatValue]);
// double 值
myNumber = [NSNumber numberWithDouble:12345e+15];
NSLog(@"%lg",[myNumber doubleValue]);
//验证两个number是否相等
if([intNumber isEqualToNumber:floatNumber] == YES)
NSLog(@"相等");
else
NSLog(@"不相等");
//验证一个number是否小于、等于或大于另一个number
if([intNumber compare:myNumber] == NSOrderedAscending)
NSLog(@"第一个比第二个大");
}
return 0;
}
NSNumber 的创建、检索方法
创建和初始化方法 | 初始化实例方法 | 检索实例方法 |
---|---|---|
numberWith数据类型 | initWith数据类型 | 数据类型Value |
允许使用@表达式创建数字对象。
intNumber = [NSNumber numberWithInteger:100];//表示创建一个值为100的整数对象
intNumber = @100;//同上语句一致
字符串对象
要使用 Objective - C 语言创建一个字符串对象,需要在字符串开头放置一个 @ 字符。
NSLog函数
NSString *str = @"test1";
NSLog(@"%@",str);
字符串常量 test 被赋值给 NSString 变量 str。之后使用NSLog显示他的值。
description方法
-(NSString *) description{
return [NSString stringwithformat: @"%i/%i",fenzi,fenmu];
}
你可以使用格式化字符 %@ 显示数组、字典和集合的全部内容,事实上,通过覆盖 description方法 还可以用这些格式的字符显示你自己类的对象。
类似于 stringwithformat: 这样的方法允许提供多个参数。这些参数使用一系列逗号分隔提供给方法。
2022年9月1日
可变对象和不可变对象
创建字符串对象的时候,会创建一个内容不可更改的对象,称为不可变对象。可以使用NSString 类来处理不可变字符串。你经常需要处理字符串并更改字符串中的字符。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"这是一个测试字符串对象方法的小程序...");
NSString *str1 = @"This is string A";//创建一个字符串A
NSString *str2 = @"This is string B";//创建一个字符串B
NSString *res;
NSComparisonResult compareResult; //用于保存后面执行的字符串操作比较的结果
//计算字符串中的字符
NSLog(@"字符串A的长度:%lu",[str1 length]);
//将一个字符串复制到另一个字符串
res = [NSString stringWithString:str1];
NSLog(@"复制:%@",res);
//将一个字符串复制到另一个字符串末尾
str2 = [str1 stringByAppendingString:str2];
NSLog(@"链接: %@",str2);
//验证两个字符串是否相等
if([str1 isEqualToString:res] == YES)
NSLog(@"str1 == res");
else
NSLog(@"str1 != res");
//验证一个字符串是否小于、等于或大于另一个字符串
compareResult = [str1 compare:str2];
if(compareResult == NSOrderedAscending)
NSLog(@"str1 < str2");
if(compareResult == NSOrderedSame)
NSLog(@"str1 == str2");
else
NSLog(@"str1 > str2");
//将字符串转化为大写
res = [str1 uppercaseString];
NSLog(@"字符串转化为大写:%s", [res UTF8String]);
//将字符串转化为小写
res = [str1 lowercaseString];
NSLog(@"字符串转化为小写:%@",res);
NSLog(@"初始字符串版本为:%@",str1);
}
return 0;
}
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"这是一个测试字符串对象方法的小程序...");
NSString *str1 = @"This is string A";//创建一个字符串A
NSString *str2 = @"This is string B";//创建一个字符串B
NSString *res;
NSRange subRange;
NSComparisonResult compareResult; //用于保存后面执行的字符串操作比较的结果
//计算字符串中的字符
NSLog(@"字符串A的长度:%lu",[str1 length]);
//将一个字符串复制到另一个字符串
res = [NSString stringWithString:str1];
NSLog(@"复制:%@",res);
//将一个字符串复制到另一个字符串末尾
str2 = [str1 stringByAppendingString:str2];
NSLog(@"链接: %@",str2);
//验证两个字符串是否相等
if([str1 isEqualToString:res] == YES)
NSLog(@"str1 == res");
else
NSLog(@"str1 != res");
//验证一个字符串是否小于、等于或大于另一个字符串
compareResult = [str1 compare:str2];
if(compareResult == NSOrderedAscending)
NSLog(@"str1 < str2");
if(compareResult == NSOrderedSame)
NSLog(@"str1 == str2");
else
NSLog(@"str1 > str2");
//将字符串转化为大写
res = [str1 uppercaseString];
NSLog(@"字符串转化为大写:%s", [res UTF8String]);
//将字符串转化为小写
res = [str1 lowercaseString];
NSLog(@"字符串转化为小写:%@",res);
NSLog(@"初始字符串版本为:%@",str1);
//从字符串中提取前3个字符
res = [str1 substringToIndex:3];
NSLog(@"前三个字符为:%@",res);
// 提取从索引5开始直到结尾的字符串
res = [str1 substringFromIndex:5];
NSLog(@"索引5之后的字符串:%@",res);
// 提取从索引5到索引13到子字符串
res = [[str1 substringFromIndex:8] substringToIndex:6];
NSLog(@"从索引5到13到字符串:%@",res);
// 更简单的方法
res = [str1 substringWithRange:NSMakeRange(8, 6)];
NSLog(@"从索引5到13到字符串:%@",res);
//从另一个字符串查抄一个字符串
subRange = [str1 rangeOfString:@"string A"];
NSLog(@"string 在索引 %lu,长度是%lu",subRange.location,subRange.length);
subRange = [str1 rangeOfString:@"string B"];
if(subRange.location == NSNotFound)
NSLog(@"未找到字符串。");
else
NSLog(@"string 在索引 %lu,长度是%lu",subRange.location,subRange.length);
}
return 0;
}
substringToIndex: 其中参数3代表的是,提取三个;如果提供的索引数对该字符串无效,就会出错。 Range or index out of bounds
substringFromIndex: 返回一个字符串,从接收者指定的索引字符开始,直到字符串结尾。
substringWithRange: 使用特殊函数 NSMakeRange(8, 6) 代表从索引8开始,截取字符串长度为6。
rangeOfString: 用来在一个字符串中查找另一个字符串,返回的是 NSRange 变量,所以必须使用一个同类型的参数接收它。
注意到 NSRange 变量,其是一个结构体,其定义为:
typedef struct _NSRange
{
NSUInteger location;
NSUInteger length;
} NSRange;
NSRange 用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围
NSRange 有2个成员
NSUInteger location : 表示该范围的起始位置
NSUInteger length : 表示该范围内的长度
可变字符串NSMutableString的介绍
NSMutableString 类可以用来创建可以更改字符的字符串对象。
NSMutableString 类继承 NSString 类。
NSMutableString 和 NSString 的区别:
- NSString 是不可变的,里面的文字内容是不能进行修改的;
- NSMutableString 是可变的,里面的文字内容可以随时更改;
- NSMutableString 能使用 NSString 的所有方法继承
关于可变与不可变的解释:
不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化。
可变: 指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改。
以下是可变字符串的基本操作:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"这是一个演示可变字符串基本操作的程序...");
NSString *str1 = @"this is string A";
NSString *search,*replace;
NSMutableString *mstr;//创建可变字符串
NSRange substr;//创建表示元素范围的字符串
//从不可变字符串创建可变字符串
mstr = [NSMutableString stringWithString:str1];
NSLog(@"%@",mstr);
//插入字符
[mstr insertString:@"mutable" atIndex:7];//在索引数7处插入字符串
NSLog(@"%@",mstr);
//插入末尾进行有效拼接
[mstr insertString:@" and string B" atIndex:[mstr length]];//通过调用length在字符串结尾处插入字符串
NSLog(@"%@",mstr);
//直接使用appendString
[mstr appendString:@" and string C"];
NSLog(@"%@",mstr);
//根据范围删除字符串
[mstr deleteCharactersInRange:NSMakeRange(16, 13)]; //从索引16处开始,删除十三个字符。
NSLog(@"%@",mstr);
//查找然后将其删除
substr = [mstr rangeOfString:@"string B and"];
if(substr.location != NSNotFound){//首先验证mstr中存在字符串string B and
[mstr deleteCharactersInRange:substr];
NSLog(@"%@",mstr);
}
//直接设置为可变字符串
[mstr setString:@"this is string A"];
NSLog(@"%@",mstr);
//替换一些字符
[mstr replaceCharactersInRange:NSMakeRange(8, 8) withString:@"a mutable string"];
NSLog(@"%@",mstr);
//查找和替换
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);
}
return 0;
}
其中,查找和替换的 while 循环可以替换为:
[mstr replaceOccurrencesOfString:search withString:replace options:nil range:NSMakeRange(0, [mstr length])];
数组对象
Foundation 数组是有序对象集合。
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
int i;
NSLog(@"这是一个测试数组对象的程序....");
//首先创建一个包含各个月份名称的数组
NSArray *monthNames =@[@"一月",@"一月",@"二月",@"三月",@"四月",@"五月",@"六月",@"七月",@"八月",@"九月",@"十月",@"十一月",@"十二月"];
//列出数组中所有的元素
NSLog(@" 月 份 名 称 ");
NSLog(@"============");
for(i = 0;i < 12; ++i ){
NSLog(@" %2i %@", i+1 ,monthNames[i]);
}
}
return 0;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableArray *numbers = [NSMutableArray array];
//创建0~9数字的数组
for(int i = 0;i < 10; ++i){
numbers[i] = @(i);
}
for(int i = 0;i < 10; ++i){
NSLog(@"%@",numbers[i]);
}
NSLog(@"使用带有格式的nslog显示");
NSLog(@"%@",numbers);
}
return 0;
}
之前提到过,不能将整数这样的基本数据类型存储在数组之类的集合中。所以我们要构造每个值 i 的 NSNumber 对象,范围从0到9。
如果需要向数组末尾添加一个对象,可以使用 addObject 方法。
[numbers addObject:@(i)];
快速枚举
for( AddressCard *theCard in _book)
NSLog(@"%-20s %-30s",[theCard.name UTF8String],[theCard.email UTF8String]);
这里对数组 book 中的每一个元素序列使用名为快速枚举的技术。他的语法非常简单:
首先定义一个能够保留数组中每个元素的变量,使用关键字 in ,然后列出数组的名称。
词典对象
词典** dictionary **是由键-对象组成的数据集合。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"这是一个测试词典对象的程序...");
NSMutableDictionary *myDictionary = [NSMutableDictionary new];
[myDictionary setObject:@"测试查找结果1" forKey:@"1"];
[myDictionary setObject:@"测试查找结果2" forKey:@"2"];
[myDictionary setObject:@"测试查找结果3" forKey:@"3"];
[myDictionary setObject:@"测试查找结果4" forKey:@"4"];
NSLog(@"1.%@",[myDictionary objectForKey:@"1"]);
NSLog(@"2.%@",[myDictionary objectForKey:@"2"]);
NSLog(@"3.%@",[myDictionary objectForKey:@"3"]);
NSLog(@"4.%@",[myDictionary objectForKey:@"4"]);
myDictionary [@"新的测试1" ] = @"新的测试结果1";
myDictionary [@"新的测试2" ] = @"新的测试结果2";
myDictionary [@"新的测试3" ] = @"新的测试结果3";
myDictionary [@"新的测试4" ] = @"新的测试结果4";
NSLog(@"新的测试1: %@",myDictionary [@"新的测试1" ]);
NSLog(@"新的测试2: %@",myDictionary [@"新的测试2" ]);
NSLog(@"新的测试3: %@",myDictionary [@"新的测试3" ]);
NSLog(@"新的测试4: %@",myDictionary [@"新的测试4" ]);
}
return 0;
}
以上两种检索方法:
[myDictionary setObject:@“查找结果” forKey:@“查找关键词”];
NSLog(@“%@”,[myDictionary objectForKey:@“查找关键词”]); 此行输出结果
myDictionary [@“查找关键词” ] = @“查找结果”;
NSLog(@" %@",myDictionary [@“查找关键词” ]); 此行输出结果
枚举词典
使用 dictionaryWithObjectsAndKeys:方法创建带有初始键值对的词典,也就是不可变的词典。
NSDictionary *myDictionary1 =
[NSDictionary dictionaryWithObjectsAndKeys:
@"输出结果测试1",
@"测试1",
@"输出结果测试2",
@"测试2",
@"输出结果测试3",
@"测试3",
nil];
for (NSString *key in myDictionary1)
NSLog(@"%@ : %@",key,[myDictionary1 objectForKey:key]);
同时也可以使用特殊语法:
{ key1 : object1, key2 : object2, .... keyn : objectn }
集合对象
#import <Foundation/Foundation.h>
@interface NSSet (Printing)
-(void) print;
@end
@implementation NSSet (Printing)
-(void) print{
printf("{");
for(NSNumber *yuansu in self)
printf(" %li ",(long) [yuansu integerValue]);
printf("} \n");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"这是一个测试集合对象的程序...");
NSMutableSet *jihe1 = [NSMutableSet setWithObjects: @1,@3,@5,@10,nil];
NSMutableSet *jihe2 = [NSMutableSet setWithObjects: @3,@-5,@100,@5,nil];
NSMutableSet *jihe3 = [NSMutableSet setWithObjects: @12,@200,@3,nil];
NSLog(@"集合1:");
[jihe1 print];
NSLog(@"集合2:");
[jihe2 print];
//相等性测试
if([jihe1 isEqualToSet:jihe2] == YES)
NSLog(@"集合1等于集合2");
else
NSLog(@"集合1不等于集合2");
//成员测试
if([jihe1 containsObject:@10] == YES)
NSLog(@"集合1中包含元素10");
else
NSLog(@"集合1中不包含元素10");
if([jihe2 containsObject:@10] == YES)
NSLog(@"集合2中包含元素10");
else
NSLog(@"集合2中包含元素10");
//在可变集合1中添加和移除对象
[jihe1 addObject:@"4"];
[jihe2 removeObject:@"10"];
NSLog(@"添加元素4删除元素10后的集合1为:");
[jihe1 print];
//获得两个集合的交集
[jihe1 intersectSet:jihe2];
NSLog(@"集合1和集合2的交集为:");
[jihe1 print];
//获得两个集合的并集
[jihe1 unionSet:jihe3];
NSLog(@"集合1和集合3的并集为:");
[jihe1 print];
}
return 0;
}
其中 print: 方法用到了之前的快速枚举的技术,从集合中提取每个元素。