Day.02.17 [转] NSString

NSString是Objective-C中核心处理字符串的类之一(类的其中之一把)

1.注意使用@符号来创建字符串

NSString *string =@“my name is LiuJiaLiang”;

2.创建空字符串,给予赋值

NSString *string =[[NSString alloc]init];

string =@“小茗"

3.创建格式化字符串:占位符(format 使格式化,设计一个板式)

[NSString stringWithFormat:@“小茗%@岁了”,23]

字符串长度

1.通过调用NSString类的对象方法length来获取字符串长度.

2.无论字符串里面是中文还是英文,那么就按一个字符来计算.

如:

NSString *str =@“xiaoming刘"

NSlog(@“length=%i”,[str length]); //得到的结果为9

分析案例

士兵与🔫

1.首先先分析有多少个类,一个是兵的类(Person),一个是枪的类(Gun),一个是弹夹的类(Clip)

2.分析各类的属性和方法,即为成员变量和行为,兵的话有名字/身高/体重(然并卵,因为这案例不引用里面的成员变量,所以暂时不管)。行为的话有开枪,而枪的话里面有成员变量弹夹(这个声明还是有用的,因为枪开火的行为需要用到弹夹,前面为什么不要呢?你麻痹的开枪还要问人家名字,体重,身高?联系实际吧,骚年),同时枪也有开火的行为.弹夹的话里面有子弹的成员变量,还有上子弹的行为(没什么,没子弹就要上弹啊).

3.分析好了,我们就上代码.

首先是Person的.h声明文件(先声明后实现)

@interfaceSoldier :NSObject

//开火,给士兵一把枪和一个弹夹

- (void)fire:(Gun*)gun clip:(Clip*)clip;

@end

我们可以清楚看到士兵类的声明里面只有一个方法;前面的基础大家恶补一下就知道了,括号里面的都是数据类型,别问我为什么,只要你以后但凡看到括号,那括号里面只能是数据类型.(OC规定的),void代表的是空类型void;Gun *和Clip *代表着传递对象作为参数,其中这里面有一种很微妙的关系;方法通过对象形参,那么可以调用该对象上的方法.那么里面调用2个对象:Gun和Clip,有种地址传递的感觉(跟着改变,后面的值一改变,然后就跟着改变).这种也称为对象参数的连续传递.:代表着传递的参数有多少个,如果是一个,那么就写一个:,而语句中有2个,那么就写2个.最后大家方法名可能大家摸不透,因为参数太多,返回值类型的存在,根本分不清谁是方法名,其实方法名是fire: clip:,可能大家都蒙了,这么长的方法,但方法名就这么短.其实你回头看一下基础,你就知道.我这里简单说一下,方法的命名是保留冒号,忽略返回值类型,忽略传递参数的类型和形参.那么剩下的就是方法名了.最主要的是保留冒号.不要忘记.

而在Person的.m实现文件

#import"Soldier.h"

@implementationSoldier

- (void)fire:(Gun*)gun clip:(Clip*)clip

{

//判断是否有枪和弹夹

if(gun !=nil&&

clip !=nil) {

[gunshoot:clip];

}

}

@end

在实现文件中,我们要先判断是否有枪和弹夹,哥们,如果你拿的不是枪,而且弹夹也是空的话,那么请你回家吧,战场不需要你.判断的话就用if语句,如果判断是真的(这里说一下nil=空,!=非,&&=且,整个判断语句是枪不是空的且弹夹不是空的.同时我们明白如果括号里面返回的数值是1,那么条件为真,如果返回的值是0,那么是假.),就执行语句[gun shoot:clip].这里大家应该糊了,这代表什么啊,为什么在这里出现呢?其实它是为了后面做铺垫.大概意思是:给gun对象发出开火的消息,即为”竟然枪和弹药我都有了,喂,我要开火啊”.这样的话,gun对象就可以调用开火的方法.开始有种对象连续传递的感觉了.如果不理解的话,那么就当它是为了调用不是在这个Person类里面,而在Gun类里面的方法写得.

之后就是Gun类的.h文件(不要问我.h是神马,往上面看你就知道了)

#import

#import"Gun.h"

#import"Clip.h"

//多文件开发中,要使用谁就导入谁的.h文件就可以了

//注意:导入的一定是.h文件,不能是.m文件

//如果导入.m文件会报重复定义错误

@interfaceGun :NSObject

{

Clip*clip;//弹夹

}

- (void)shoot:(Clip*)c;

@end

上面已经解释了,Gun里面的成员变量是clip,为什么它要存在?而Person类里面的成员变量不写?屁!因为它在后面有用啊,方法的实现还用到它呢.简单分析一下:Clip *clip =>(Clip *是数据类型,clip是一个变量).而方法的话-(void)shoot:(Clip *)c =>声明了一个开火的方法.由于要开火是要用到弹夹的(靠,兄弟开火要用耗弹夹的吧),所以就传递一个弹夹参数进去,也是同样的格式.

现在轮到Gun类的.m文件

#import"Gun.h"

@implementationGun

- (void)shoot:(Clip*)c

{

//判断有没有弹夹

if(c !=nil) {// nil == null ==没有值

//判断有没有子弹

if(c->_bullet>0) {

c->_bullet-=1;

NSLog(@"打了一枪%i", c->_bullet);

}else

{

NSLog(@"没有子弹了");

}

}else

{

NSLog(@"没有弹夹,请换弹夹");

}

}

@end

同样方法入口进来的时候,我们先判断弹夹里面是否有子弹,子弹都没有的话,打飞机啊!同样我们运用到if来判断,大家可能看到判断条件的c->buttle就蒙了吧.这里的意思是指针变量c指向了Clip类里面的成员变量_buttle(中文意思:子弹).可能大家都会说哪里来的Clip类呢,这个其实就是间接拷贝,.h文件里我们看到它拷贝了Clip.h文件(#import“Clip”).细心的你估计能找得到.这个在最后面我会跟大家说明一下.回到正题,判断弹夹里面有没子弹.如果有子弹的话,这里就输出”打了一枪”,其中%i是格式化输出占位符,简单地来说就是子弹这个坑来填.而由于我打了一枪,那么子弹是否减少一发,不要想着无限子弹,现实生活中没可能.而里面的c->_buttle-=1(意思就是c->_buttle=c->_buttle-1,其实就是减一发子弹).再次弹夹没有子弹的话,那么就输出”没有子弹了”.而在此基础上,我们可以联想到子弹是装在弹夹上的,我们也可以判断弹夹是否为空,因为弹夹也有空的一天.如果弹夹为空的话,那么就输出”没有弹夹,请换弹夹”,如果不为空的话,在判断子弹是否为空,把判断子弹是否为空的语句嵌套在判断弹夹里面.

最后一个Clip类.h文件

#import

@interfaceClip :NSObject

{

@public

int_bullet;//子弹

}

- (void)addBullet;

@end

声明成员变量子弹这个属性,注意的是要添加@public,因为代表这个成员变量可以访问,可以给其他文件使用.因为成员变量声明中默认是@protect,是受保护属性,其他文件是不可访问和使用的.同样我们添加了增加子弹的方法.这个方法实现也很简单,后面你就知道为什么要用到成员变量_buttle了.

Clip类.m文件

#import"Clip.h"

@implementationClip

- (void)addBullet

{

//上子弹

_bullet=10;

}

@end

这个方法实现很简单,只是简单地赋值给_buttle.也就是说每次调用这个方法的话,就会让枪重新上弹,而且还是10颗子弹哦.有子弹了我们就可以乱射一通了.哈哈.

最后的main.m文件(主函数)

intmain(intargc,constchar* argv[]) {

// 1.创建士兵

Soldier*sp =[Soldiernew];

// 2.创建一把枪

Gun*gun = [Gunnew];

// 3.创建弹夹

Clip*clip = [Clipnew];

[clipaddBullet];   //子弹数量为10

// 2.让士兵开枪

//让对象作为方法的参数传递

//    [sp fire:gp]; //地址

[spfire:gpclip:clip];

return0;

}

这里就简单概括一下吧,我们创建了士兵,枪,弹夹这3个对象,我们先给枪加满子弹(即为10发),然后再调用fire方法.来进行开枪的行为.实现目的,结束函数.

在各个.h文件中我们都可以有#import“XXX.h”,其实这个是引用头文件,把右边的文件拷贝到当前位置.其实简单来说就是我的女朋友就是你,那么我就可以使用你的钱,你也不会计较.哈哈.

总结:写士兵与枪的案例,其实简单地说明各个类属性和方法的运用和之间的联系,其实大家通过传递对象参数来达到一个方法嵌套另一个方法.也就是说:刚开始的是士兵要调用开火这个方法(fire),然后fire方法里又有另外一个shoot方法.大家都不要给方法里面的判断给搞糊涂了,它只是完善这个方法.让方法更加有逻辑性.所以刚开始写任何与之相关的对象,或者什么对象做了什么行为.我们不必太复杂,先从简单出发.然后再完善这个方法.这样的话,我们就不必想来想去都没思路,总是不知道从哪一步写起.其实复杂的程序都是从简单的代码实现开始做起.所以,Just do it.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容