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.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容