在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
C#妹妹:哇,冤家路窄啊,这个不是Objective-C阿姨家的狗狗么?
狗狗:日,到底谁跟谁是冤家。。
C#妹妹:不服气呀~再给你弄一陀吃吃。。
#import <Foundation/Foundation.h> #import "Dog.h" int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Dog *d=[Dog new]; [d Eat:@"便便" EatQty:1]; [d release]; [pool drain]; return 0; }
C#妹妹:操,升级啦,看姐姐我扒你的皮,毁你的源代码。。
Objective-C阿姨:你这个小姑娘为啥总跟我狗狗过不去呀。
C#妹妹:它不吃屎也就罢了,还说什么“你留着自己吃。。。”,肯定程序出问题了,我帮他调试一下。
Objective-C阿姨:就是怕你再害它,我昨天给他升级了。。。现在代码是这个样子。。
#import "Dog.h" @implementation Dog -(void) Sound { NSLog(@"汪汪!"); } BOOL isTrueFood(NSString *food) { NSRange r=[@",包子,骨头,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]]; if(r.length>0) return(YES); else return(NO); } -(void) Eat:(NSString *) food EatQty:(int) count { if(isTrueFood(food)==YES) { NSLog(@"吃%d斤%@",count,food); } else { NSLog(@"你留着自己吃吧。。。"); } } @end//Dog C#妹妹:哇,我们天朝特色的敏感词语过滤技术你都用上了。。。真是同一个世界,同一个噩梦啊。。。
Objective-C阿姨:,你能不能少贫点。。。。
C#妹妹:貌似其他都能看懂,除了这一句不太明白
NSRange r=[@",包子,骨头,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]];
Objective-C阿姨:这个语句里边就是用了两个NSString的方法。一个是实例方法rangeOfString,一个是类方法stringWithFormat。NSString是Cocoa中用于字符串处理的类,比C原始的字符串数组方便了很多,就像.NET的String一样,内置了很多方法。
rangeOfString:功能类似与.NET中的String.IndexOf,判断一个字符串在另一个字符串中的位置,但是返回的类型是NSRange,而不是数字
NSRange的定义估计你一看就知道怎么回事了
typedef struct _NSRange { NSUInteger location;//起始位置 NSUInteger length;//长度 } NSRange; 其实NSRange.location就相当于.NET中String.IndexOf的返回值。
C#妹妹:但是.NET中如果IndexOf检索不到相应的内容,返回负数,而这个location是NSUInteger类型,看起来这个类型是一种无符号整数啊,如何表示检索不到内容呢?
Objective-C阿姨:有两种方法可以解决这个问题。一种是判断length的长度,如果长度为0,表示没有找到相应的内容,另外一种判断location是否等于NSNotFound。其实NSNotFound就是NSUInteger的最大值LONG_MAX
C#妹妹:挺经典的,.NET里用负数表示检索不到内容,Objective-C里边用最大值表示。
Objective-C阿姨:是的,rangeOfString的用法类似这样
NSString *word=@"tive"; NSString *str=@"这是Objective-C家的狗狗!"; NSLog(@"在字符串‘%@’中搜索‘%@’",str,word); NSRange r=[str rangeOfString:word];//在str中搜索word 返回NSRange 里边包含{location和length} if(r.location==NSNotFound)//这里判断if(r.length<=0)也是一样的 NSLog(@"这句话里没有找到%@",word); else NSLog(@"这句话中从第%lu个字符开始后边%lu个字符是%@",r.location+1,r.length,word); rangeOfString还可以有个参数 判断是否区分大小写什么的。比如可以这样用
NSRange r=[str rangeOfString:word options:NSCaseInsensitiveSearch];//NSCaseInsensitiveSearch表示不区分大小写 如果看着还有点晕,再回顾一次Objective-C给对象发送消息的方式吧
另外一个用到的函数
stringWithFormat:功能类似与.NET中的string.Format,也同样都是类方法,都是用来生成字符串的。用法你看看下面的例子
NSString *str2=[NSString stringWithFormat:@"%@爱吃%@",@"狗狗",@"包子"]; NSLog(@"%@",str2);//这句话输出 狗狗爱吃包子 弄明白这两个方法,现在在看下面的语句应该就明白了吧。
NSRange r=[@",包子,骨头,肉,冰激凌," rangeOfString:[NSString stringWithFormat:@"%@%@%@",@",",food,@","]]; 其实是两个方法的嵌套
先向NSString类发送消息stringWithFormat生成食物名称的字符串,比如@“,包子,”
然后再向字符串@",包子,骨头,肉,冰激凌,"其实也就是NSString的实例发送消息rangeOfString检索@“,包子,”是否包含在字符串@",包子,骨头,肉,冰激凌,"中。
C#妹妹:好一段纠结的代码。。。。
Objective-C阿姨:现在就比较一下NSString与.NET中的System.String吧。
关于字符串长度。
NSString用方法length方法。System.String有Length属性。两者都充分考虑到中文字符的问题,不论英文还是中文日本,每个字符长度加1。
关于字符串比较。
Objective-C不能用“==”号,比较字符串内容的,“==”保留了原始的引用比较功能。C#已经把“==”处理成比较直观的内容比较。Objective-C中比较字符串是否相同正确的方法是isEqualToString。
与.NET的System.String相同,NSString同样是不可变的
NSString所谓的改变就是生成新的字符串。与.NET的String.Text.StringBuilder一样,Objective-C提供了NSMutableString,这个类表示的字符串是可以修改的。但是与StringBuilder不同的是,他继承自NSString,意味着基类的方法,他都可以用。
各位同学,本人学习Objective-C时间很短,学习Objective-C其实不是为了Mac、iPhone开发,并没有实用, (01)认识Objective-C--初次见面的问候 待续⋯⋯ |
请发表评论