字符串申明和赋值①至④
① NSString *str1 = @"xiaoqiang";
// //每个init方法,对应一个stringWith的类方法
② NSString *str1 = [[NSString alloc] initWithFormat:@"%d,%c,%@",1,'q',@""];
//用类方法写法是:NSString * str2 = [NSString stringWithFormat:str1];下面雷同
//用了string这个方法,NSString后面就不需要alloc
③//将C字符串,转换成OC字符串
NSString * str3 = [[NSString alloc]initWithUTF8String:"aoe,iuv"];
④//用一个字符串,创建另一个字符串
NSString * str2 = [[NSString alloc] initWithString:str1];
⑤//使用格式符,创建字符串 这个就是②的方法
NSString * str4 = [[NSString alloc] initWithFormat:@"hello %d %c %.2f", 5, 'A', 3.1415926];
//字符串转数字
int ret = [str1 intValue];//输出结果12345
long long ret2 = [str1 longLongValue];//输出结果12345
double ret3 = [str1 doubleValue];//输出结果12345.600000
NSInteger ret4 = [str1 integerValue];//输出结果12345
NSLog(@"%d", ret);
// 1.int或其他数据类型转成NSString
NSString *str = [NSString stringWithFormat:@"%d",10];
NSLog(@"%@",str);
输出为10
//将C字符串,转换成OC字符串
NSString * str3 = [[NSString alloc] initWithUTF8String:"aoe,iuv"];
//OC字符串转C字符串
//注意 *p这个指针
const char * p = [@"aoeiuv" UTF8String];
NSLog(@"%s", p);
二.字符串操作方法
1.返回字符串的长度
NSUInteger len = [str length];
2.返回单个字符
unichar c = [str characterAtIndex:3];
3.比较两个字符串的大小关系
①
BOOL ret = [str1 isEqualToString:str2];
②
NSComparisonResult ret2 = [str1 compare:str2];
// NSOrderedAscending = -1L,升序//-不是表示负号
// NSOrderedSame, 相等
// NSOrderedDescending 降序
4.查找子串的位置和范围
NSRange range = [A rangeOfString:@“B”];
//如果字符串A的部分和字符串B整体相同,则称B为A的子串,A为B的父串
//如父串@"1234567890" 子串@"345"
//父串的值不会变 还是“123456789”
range.location 表示起点 range.length表示范围长度 NSNotFound表示不存在
5.子串的提取
①种
NSString * subStr1 = [str substringToIndex:5];
//从父串第0个字符提取到第5个字符,不包括第5个(0--4),生成新字符串,创建对象,返回新字符串地址。
②种
NSString * subStr2 = [str substringFromIndex:5];
//从第5个字符开始提取到字符串尾,包括第5个,生成新字符串,返回地址。
③种
NSRange range = {5, 4};
//范围是起点和长度而非起点和终点
NSString * subStr3 = [str substringWithRange:range];
//根据制定范围,提取子串,生成新串,返回地址
6.字符串的截取
第一种:
格式:类型+*+变量名 = 【字符串 componentsSeparatedByCharactersInSet:@“写上截取的字符” 】
第二种:这个也是比较,和第一个不同,只有字符串有@“,” 就会截取,或者只要有@“/”,也会截取,只要有@“,/”也会截取;
易错点 截取之后有没有空号
下面这个例子
打印出来的结果是: “”, “1”, “1”, “5”, “2” “”; 前后都有空格;
NSString *str1 = @"-1-1+5-2-“;
NSMutableArray * arrNum = [NSMutableArray arrayWithArray:[str1 componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"+-"]]];
NSLog(@"%@",arrNum);
NSArray *array = [str componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" \n"]];
// array 表示的是数组 截取之后是一个一个字符串放在数组里面
NSArray *array = [str1 componentsSeparatedByString:@" "];
for (id rr in array) {
NSLog(@"%@",rr);
}
NSString *str = @"EXO,男%18612598888,演员,16,[email protected],北京";
字符串的拼接
字符串拼接只能是从第一个字符之后进行拼接
1:将string字符串转换为array数组
NSArray *array = [Str componentsSeparatedByString:@","];
2:将array数组转换为string字符串
NSString *tempString = [mutableArray componentsJoinedByString:@","];--分隔符
NSString *str = 这里必须是数组 componentsJoinedByString:@"$"];
可变字符串的一些特殊方法
NSMutableString * str = [[NSMutableString alloc] init];·
//创建空字符串 @"" 字符串对象存在,但是里面有0个字符
①重置字符串内容
//重置就是把原来的字符串覆盖
[str setString:@"0123456789"];
NSLog(@"%@",str); //输出结果0123456789
[str setString:@"XXXXXXXX"];
NSLog(@"%@",str);//输出结果XXXXXXXX
②从字符串最后 拼接
第一种写法
[str setString:@"XXXXXXXX"];
[str appendString:@"9876543210"];
NSLog(@"%@",str);
//输出结果XXXXXXXX9876543210
第二种写法
[str appendFormat:@"%d %c %.2f", 34, 'T', 2.34];
NSLog(@"%@",str);
//输出结果XXXXXXXX987654321034 T 2.34
字符串的一些特殊方法
大写转小写
NSString *str = [@“ADD”lowercaseString];
小写转大写
NSString *str1 = [@“dd”,uppercaseString];
把首字母转写成大写
NSString *str2 = [@“adff”,capitalizedString];
判断字符串是不是以这个字符串开头
[@“hi,nihao”,hasprefix:@“hi”];
判断字符串是不是以这个字符串结尾
[@“hi,nihao”hasSuffix:@“nihao”];
从字符串的末尾进行拼接
第一种:
[strM appendString: @“sdafd”];
第二种:
[strM appendFormat:@“%d——%@”,2,@“小强”];
从指定字符串的某个位置进行添加 如果放入数组中 元素自动往后移动;
[strM insertString:@“广告”atIndex:0];
删除某个位置和范围的字符
NSRange range = {1,3};
[str deleteCharactersINRange: range];
替换某个位置和范围的字符
[str replaceCharacterInRange:range withString:@“天明”];
增 删 改 查
二 可变字符串的创键
// 可变字符串的创建方式
// 1.
NSMutableString *strM = [[NSMutableString alloc] init];
// 可变字符串特有的方法
[strM setString:@"秦时明月"];
// 2.
NSMutableString *strM1 = [[NSMutableString alloc] initWithString:strM];
NSLog(@"%@",strM1);
// 3.
NSMutableString *strM2 = [NSMutableString stringWithUTF8String:"芈月传"];
2.可变字符串的常用方法
NSMutableString *strM2 = [NSMutableString stringWithUTF8String:"芈月传"];
// 从字符串后面开始拼接
[strM2 appendString:@"第一集"];
输出打印结果为:芈月传第一集
//从字符串后面开始拼接 可以添加拼接的字符串
[strM2 appendFormat:@"%d--%@",3,@"呵呵"];
NSLog(@"%@",strM2);
输出打印结果为:芈月传第一集3--呵呵
// 在我们索引之前的位置添加
[strM2 insertString:@"广告" atIndex:0];
NSLog(@"%@",strM2);
输出打印结果为:广告芈月传第一集3--呵呵
// 删除某个位置和范围的字符
NSRange range = {1,3};
[strM2 deleteCharactersInRange:range];
NSLog(@"%@",strM2);
输出打印结果为:广传第一集3--呵呵
// 替换某个位置和范围的字符
[strM2 replaceCharactersInRange:range withString:@"天明"];
NSLog(@"%@",strM2);
输出打印结果为:广天明集3--呵呵
字符串总结:
Foundation类库,提供了三个基础的数据结构,是三个类。
【字符串】 【数组】 【字典】
NSString对象是不可修改的。 (不可变字符串)
一:不可变字符串:(NSString)
字符串的申明
①:对象的申明(初始化):
//创建一个对象 赋给 str1 是一个地址
NSString * str1 = @“我是小强”;
②:字符串的拼接
//使用initWithFormat 函数来进行
比如要在钱枫的钱字前面加数字 再钱和枫字中间加一个字符,再枫字后加一个字符串或者对象
格式: NSString *+名称 = [[NSString alloc] initWithFormat:@"%d钱%c枫 %@",2,'B',@"”];//注意加一个转对象符号。
然后打印出来
NSLog(@"%@",str2);
③
1.c的字符串转化为oc字符串
利用函数 initWithUTF8String
格式
这是再输入的是数字的情况下
//将数字oc数字转换成C数字
double num1 = [[NSString stringWithUTF8String:sum1]doubleValue];
见 1216代码 下午课堂练习文档
这是中英文情况下
NSString *str3 = [[NSString alloc] initWithUTF8String:"铅封"];
NSLog(@“%@“, str3);
2.oc字符转化成c字符
const char * p = [@"aoeiuv" UTF8String];
NSLog(@"%s", p);
stringWithUTF8String
//这个函数后面的字符串不用加“@”
④ 用一个字符串创建另外一个字符串
使用函数initWithString来
格式:
1:首先定义一个指针变量(NSString*类型)并赋值
NSString *+赋值过去的指针变量=“字符串”;
NSString *被创建的指针变量 = [[NSString alloc] initWithString:赋值过去的指针变量];
⑤3种类方法把c字符串转变成oc字符串的方法
1.首先定义一个指针变量(NSString*类型)并赋值
NSString *+赋值过去的指针变量=[NSString stringWithFormat:“字符串”];
方法一:
NSString *str22 = [NSString stringWithFormat:@"少年郎"];
或者
NSString * str7 = [NSString stringWithFormat:@"%d %c %s", 123, 'T', "678"];
方法二:
NSString *str33 = [NSString stringWithUTF8String:"我给你讲"];
方法三:
NSString *str44 = [NSString stringWithString:str1];
二:字符串操作方法
- 返回字符串的长度
借用函数 :NSUInteger
格式 NSUInteger + 变量名 = [指针变量名 变量名 ];
例子:
返回的值为7;
NSString *str = @"1234567";
//注释:NSInteger length( 变量名) = [str length];
NSInteger length = [str length];
NSLog(@"%d",length);
2.返回单个字符
借用函数 :characterAtIndex(Index从0开始算起)
格式 unichar 自己随便定义一个变量 = [ 指针变量名 characterAtIndex : 要返回值所在的位置(从0开始算起)]
例子
NSString *str = @"1234567";
unichar c = [str characterAtIndex:5];
NSLog(@"%c",c);
- 字符串的比较
借用函数NSComparisonResult
方法一:
格式 NSComparisonResult 自己定义一个变量名 = [被比较的指针变量名 compare:要比较的指针变量名];
例子
//比较两个字符串的大小关系
NSString *str = @"1234567”;(被比较的变量名)
NSString *str2 = @"2345678”;(要比较的变量名)
NSComparisonResult rect = [str compare:str2];
比较方法 :str2与str比较 则如下定义
// NSOrderedAscending = -1L,升序
// NSOrderedSame, 相等
// NSOrderedDescending 降序
if (rect == NSOrderedAscending) {
NSLog(@"右边大");
}else if (rect == NSOrderedSame){
NSLog(@"相等");
}else if (rect == NSOrderedDescending)
{
NSLog(@"左边大");
}
借用BOOL // Yes 表示真(1) NO表示假(0)
方法二:
BOOL 自己定义一个变量名 = [被比较的指针变量名 isEqualToString:要比较的指针变量名];
NSString * str1 = @"abc";
NSString * str2 = @"abd";
//比较两个字符串是否相等
BOOL ret = [str1 isEqualToString:str2];
if (ret == YES) {
NSLog(@"两字符串相等");
}else{
NSLog(@"两字符串不等");
}
字符串的一些方法:
// 1. 把大写转成小写
NSString *engW = [@"ABCD" lowercaseString];
// 2. 小写转成大写
NSString *engG = [@"cdesf" uppercaseString];
// 3.转成首字母大写
NSString *engF = [@"fadsfadsfdsa" capitalizedString];
// 判断字符串是不是以某个字符串开头
[@"hello,nihao" hasPrefix:@"hello"];
// 判断字符串是不是以某个字符串结尾
[@"hello,nihao" hasSuffix:@"nihao"];
5.子串的提取
有三种形式
第一种
借用函数substringToIndex (开区间)(0-4)
格式:
NSString * 自己定义变量名 = [被提取的指针变量名(str) substringToIndex:5(提取的个数)];
从第0个字符提取到你所要提取的字符为止
例子:
NSString * str(被提取的指针变量名) = @"0123456789";
NSString * subStr1 = [str(被提取的指针变量名) substringToIndex:5(提取的个数)];
输出结果为(0-4)即到第5个个字符
sub
第二种
从自己选定的第几个字符提取 直到最后
借用函数substringFromIndex 【闭区间】
格式:
NSString * 自己定义变量名 = [被提取的指针变量名(str) substringFromIndex:从哪个字符开始提取直至末尾比如从第一个字符开始则这里写0];
NSString *str = @"渴了喝露水,饿了吃蚂蚱";
// 从第二个字符开始截取 直到最后(喝露水,饿了吃蚂蚱)
NSString *sub2 = [str substringFromIndex:2];
NSLog(@"%@\n",sub2);
输出结果为:喝露水,饿了吃蚂蚱
第三种
借用函数
substringWithRange
格式
先定义一个范围 自己定义的起点到指定的字长为止;
NSRange range = { 起点,长度};
NSString *自己定义变量名 = [str substringWithRange:range];
四. 可变字符串(NSMutableString)
1.凡是NSString的方法,NSMutableString都能用
2.凡是传参需要传入NSString * 传入NSMutableString *也行
//禁止用下述方法创建可变字符串 @"我是不可变字符串" 这句表达式返回一个不可以变字符串的地址
//NSMutableString * str3 = @"我是不可变字符串";
格式
定义格式
NSMutableString * str1 = [[NSMutableString alloc] initWithString:@"hello world!”];//注意加@
NSMutableString * str2 =[NSMutableString stringWithUTF8String:"123456”];
一:字符串的截取
借用函数componentsSeparatedByCharactersInSet
格式:类型+*+变量名 = 【字符串 componentsSeparatedByCharactersInSet:@“写上截取的字符” 】
格式二
NSArray *array = [str componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" \n"]];
// 字符串的截取
NSString *str = @"a b c";
// array 表示的是数组 截取之后是一个一个字符串放在数组里面
NSArray *array = [str componentsSeparatedByString:@" "];
for (id rr in array) {
NSLog(@"%@",rr);
}
二 : 字符串的拼接
格式
NSString *指针变量名 = [被拼接字符串的指针变量名(字符串本身也可以) componentsJoinedByString:@"$"];
例子:
NSString *str = @"EXO,男%18612598888,演员,16,[email protected],北京";
NSString *strP = @"EXO,男%18612598888,演员,16,[email protected],北京"componentsJoinedByString:@"$"];
NSLog(@"%@",strP);
输出打印的结果为
EXO演员[email protected]$北京
三 字符串的转换
// ******* 字符串和基本数据类型的转换********
// 1.int转成NSString
NSString *str = [NSString stringWithFormat:@"%d",10];
NSLog(@"%@",str);
输出为10
// 2. NSString转成int
int strNum = [str intValue];
NSLog(@"%d",strNum);
输出为10
四 oc字符串的位置和范围查找
格式
range.location 表示起点 range.length表示范围长度
if (range.location == NSNotFound) {
NSLog(@"不存在");
}else
{
NSLog(@"存在");
NSLog(@"%lu---%lu",range.location,range.length);
}
// *******查找字符串的位置和范围********
NSString *strC = @"北京欢迎你";
NSRange range = [strC rangeOfString:@"欢迎"];
if (range.location == NSNotFound) {
NSLog(@"不存在");
}else
{
NSLog(@"存在");
NSLog(@"%lu---%lu",range.location,range.length);
}
// 判断是不是字符串
使用判断方法 isKindOfClass
例如
BOOL ret = [@“xiaoqiang” isKindOfClass]
相同点:
都是NSObject的比较Class的方法.
不同点:
isKindOfClass:确定一个对象是否是一个类的成员,或者是派生自该类的成员.
isMemberOfClass:确定一个对象是否是当前类的成员.
isKindOfClass,isMemberOfClass,isSubclassOfClass的区别
今天突然被问到isKindOfClass,isMemberOfClass的区别,瞬间懵了,虽然是知道根据类的名称判断是否属于这个类,但没有具体的了解,总归问到的时候不能回答 ”用的时候看心情吧0.0“,就区别了一下,其实也很简单
以下的类层次是这样的,BaseZombie是所有僵尸类的基类,ZombieType1是继承于BaseZombie的一个类,textType是继承于ZomboeType1的类
@interface BaseZombie : NSObject
@interface ZombieType1 : BaseZombie
@interface Tet5extType1 : ZombieType1
首先看一下开发文档中描述isKindOfClass
- (BOOL)isKindOfClass:(Class)aClass
Description
Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class. (required)
//意思是返回一个BOOL类型的值,表示调用该方法的类 是否是 参数类 或者 继承于参数类
通过程序来反馈下结果会更加的明显,
TextType1 * text1 = [[TextType1 alloc]init];//初始化一个测试子类
BOOL b1 = [text1 isKindOfClass:[TextType1 class]];//YES
BOOL b2 = [text1 isKindOfClass:[ZombieType1 class]];//YES
接下来看一下开发文档中的描述isMemberOfClass
- (BOOL)isMemberOfClass:(Class)aClass
Description
Returns a Boolean value that indicates whether the receiver is an instance of a given class. (required)
//意思是返回一个BOOL类型的值,表示调用该方法的类 是否是 参数类
通过程序反馈结果如下
BOOL b3 = [text1 isMemberOfClass:[TextType1 class]];//YES
BOOL b4 = [text1 isMemberOfClass:[ZombieType1 class]];//NO 父类不被承认
最后一个是开发文档中的isSubclassOfClass
//注意这是一个类方法
- (BOOL)isSubclassOfClass:(Class)aClass
Description
Returns a Boolean value that indicates whether the receiving class is a subclass of, or identical to, a given class.
//意思是返回一个BOOL类型的值,表示调用该方法的类 是不是 参数类的一个子类 或者 是这个类的本身
程序反馈如下
BOOL b5 = [textType1 isSubclassOfClass:[ZombieType1 class]];//YES
BOOL b6 = [textType1 isSubclassOfClass:[textType1 class]];//YES
BOOL b7 = [textType1 isSubclassOfClass:[NSString class]];//NO
综上看来,isSubclassOfClass和isKindOfClass的作用基本上是一致的,只不过一个是类方法,一个是对象方法。
isMemberOfClass 筛选条件更为苛刻,只有当类型完全匹配的时候才会返回YES。