资讯专栏INFORMATION COLUMN

iOS学习笔记之 Objective-C (三)

shiguibiao / 1888人阅读

摘要:它有和两个值,顾名思义。当然也提供了长度可变的相应类型,后者一般是前者的子集,例如。另一个问题就是,不能将加入数组,因为这代表数组到此结束,如果需要加入一个空对象,请使用。但后者的缺点是不能对数组成员进行修改删除操作,否则编译器将报错。

这篇文章我们讲讲 OC 中的类型。

上一篇文章已经说了,OC是对C的扩展,因此可以直接使用C中的类型:

long l;
int i;
float f;
double f2;
bool isTrue;
void m;

struct {
 
    int score;
 
    char myId;
 
} student;

// ...

接下来介绍 Foundation 框架中给我们带来的新的类型:

布尔型 BOOL

注意大小写,这不是C中的 bool ,不知道这个类型的定义是否是多此一举。
它有 YESNO 两个值,顾名思义。我们知道,C中定义真假,无非是0或非0,并且它可以喝数值相互转换,但 BOOL 显然不行。
内存中, YESNO 是八位的,值如下:

    YES:00000001
    NO :00000000

当使用 BOOL 与数值比较时,只有数值的低位会参与比较,从而得出不准确的结果,所以千万不要这么做。下面上一段官方的example:

#import 

BOOL areIntsDifferent(int thing1,int thing2)
{
    if(thing1==thing2)
    {
        return NO;
    }
    else {
        return YES;
    }
}

NSString *boolString(BOOL yesNo)
{
    if(yesNo == NO)
    {
        return @"NO";
    }
    else {
        return @"YES";
    }
}

int main(int argc, const char * argv[])
{

    BOOL areTheyDifferent;
    areTheyDifferent = areIntsDifferent(5, 5);
    
    NSLog(@"Are %d and %d different? %@",5,5,boolString(areTheyDifferent));
    
    areTheyDifferent = areIntsDifferent(23,42);
    NSLog(@"Are %d and %d different? %@",23,42,boolString(areTheyDifferent));
    
    return 0;
}
字符串 NSString

为区别于 C 中的 string 字符串, NSString 字符串会在 双引号前加 @ ,前文中我们已经看到了。

NSString 本身就提供了很多有用的方法,我们看代码:

//...

NSString *string1 = [[NSString alloc] init]; // 构造空字符串

NSString *string2 = [[NSString alloc] initWithString:@"This is a String!"];  // 构造字符串

NSString *string3 = @"This is also a String!";
string1 = @"This is the first String!";
// 常量字符串,这个最简单。

/* 将C中的string类型赋过来 */

char *Cstring = "This is a String!";
 
NSString *cString = [[NSString alloc] initWithCString:Cstring];
 
NSLog(@"astring:%@,%@",string1,string2);
 
[astring release];

//...
创建格式化字符串:
NSString *stringFormat = [[NSString alloc]initWithFormat:@"This is a formated string ,number %i",1];

NSLog(@"Format:%@",stringFormat);

对了,EcmaScript 6 已经引进了跨行字符串以及格式化字符串,有兴趣的同学可以谷歌一下!

比较字符串:
NSString *string01 = @"This is a String!";
 
NSString *string02 = @"This is a String!";

NSString *astring01 = @"This is a String!";
 
NSString *astring02 = @"this is a String!";

/* 判断两者内容是否相同,下面两种方法都可以: */
 
BOOL isEqual = [string01 isEqualToString:string02]; // YES

BOOL compare1 = [string01 compare:string02] == NSOrderedSame; 
 
/* NSOrderedAscending判断两对象值的大小:按字母顺序进行比较,astring02大于astring01为YES */

BOOL compare2 = [astring01 compare:astring02] == NSOrderedAscending;

/* NSOrderedDescending判断两对象值的大小:按字母顺序进行比较,astring02小于astring01为真 */

BOOL result = [astring01 compare:astring02] == NSOrderedDescending;    
查找字符串某处是否包含其他字符串:
NSString *string1 = @"This is a string";
 
NSString *string2 = @"is a";

NSRange range = [string1 rangeOfString:string2];
/* 
  NSRange 类型实际上是一个C的结构体,不要被这个不明觉厉的东东吓到

  struct {
    int location;
    int length;
  } NSRange;
*/

int location = range.location;  
// 包含字符串所在的起始位置,这里的值为5,如不存在,为-1
int leight = range.length;  
// 长度,这里的值为4,如不存在,为0
截取字符串:
NSString *string0 = @"This is a string";

// 1.从字符串的开头一直截取到指定的位置,但不包括该位置的字符

NSString *string1 = [string0 substringToIndex:3];
 
NSLog(@"string1:%@",string1);  // string1:Thi

// 2.以指定位置开始(包括指定位置的字符),并包括之后的全部字符

NSString *string2 = [string0 substringFromIndex:3];
 
NSLog(@"string2:%@",string2);  // string2:s is a string

// 3.按照所给出的位置,长度,任意地从字符串中截取子串

NSString *string3 = [string0 substringWithRange:NSMakeRange(0, 4)];

/* NSMakeRange 顾名思义,创建一个NSRange类型的结构体 */

NSLog(@"string3:%@",string3);  // string3:This
插入字符串

OC这种静态语言,中的很多引用类型(这么说合适么?)的 内存空间都是固定的内存空间都是固定的内存空间都是固定的,对于习惯了 js 和 python 的程序员们,重要的事情说三遍!
所以嘞,什么NSString类型啊,以及我们后面要讲的NSArray、NSSet这类东西长度都是固定的。当然OC也提供了长度可变的相应类型,后者一般是前者的子集,例如: NSMutableString NSMutableArray 。想要修改字符串,就要用到这种类型。

NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"This is a NSMutableString"];

// 1. 把一个字符串接在另一个字符串的末尾

[string1 appendString:@", I will be adding some character"];
 
[string1 appendFormat:[NSString stringWithFormat:@",%i",100]];
 
NSLog(@"string1:%@",string1);

// 2. 在指定位置插入字符串

[string1 insertString:@"Hi! " atIndex:0];

// 3. 替换原有内容

NSMutableString *setString1 = [string1 setString:@"Hello World!"];

// 4.用指定字符串替换字符串中某指定位置、长度的字符串

[string1 replaceCharactersInRange:NSMakeRange(0, 4) withString:@"That"]; // That is a NSMutableString

// 5.检查字符串是否以另一个字符串开头或结尾

NSString *fileName = @"NSStringInformation.txt";
 
[fileName hasPrefix:@"NSString"] = = 1 ?  NSLog(@"YES") : NSLog(@"NO");
 
[fileName hasSuffix:@".txt"] = = 1 ?  NSLog(@"YES") : NSLog(@"NO");
数值类型 NSNumber

它实际上是一种数值对象,但我们一般仍然使用C语言中的数值类型。下面代码仅简单演示一下用法:

NSNumber *number = [NSNumber numberWithInt:123]; // 创建一个整型值
// 或使用构造方法 [[NSNumber alloc] initWithInt:123]

NSLog(@"%i",[number intValue]);
// 或 NSLog(@"%@",number);

/*
  还有:
  [NSNumber numberWithBool];
  ... numberWithChar
  ... numberWithFloat

  ... stringValue
  ... isEqualToNumber:(NSNumber *) aNSNumberVariable
*/
数组: NSArrayNSMutableArray

OC中的数组有一个好,那就是它可以储存不同类型的变量,并且, NSArray 不能保存基本类型(必须是引用类型——作者注:这个术语用在OC编程中并不严谨)。

如果需要将基本类型存储在 NSArray 数组中,上面的 NSNumber 就派上了用场。我一直觉得 NSNumber 就像 pythonjava 里的包装器对象,能起到类似作用的类型还有 NSValueNSDate

另一个问题就是,不能将 nil 加入 NSArray 数组,因为这代表数组到此结束,如果需要加入一个空对象,请使用 NSNull

想要查看 Foundation 中提供的全部类型,请点击苹果官方文档。

还是直接代码演示一遍:

    NSArray *arr = [NSArray arrayWithObjects:@"Sep",@"Januay",@"April",nil];
    
    /*
    
      由于 nil 只代表数组结束,所以实际上数组有三个成员。
     
      也可以直接赋值:
      
      NSArray *arr=@[@"Sep",@"Januay",@"April",nil];
    */
    
    for(int i = 0;i<[arr count];i++){
        NSLog(@"%@ at count %i",name,i);
    }
    
    // count 即数组的长度,相当于 java数组中的length
    
    /*
    
     我们还可以用 for ... in 语法快速遍历数组,
     与js中的 for ... in 语法不同,OC对此进行了优化,实际上比for语法遍历数组的速度更快。
     但后者的缺点是不能对数组成员进行修改、删除操作,否则编译器将报错。
     
     */
     
     // 返回数组指定下标的成员:
     NSString *str0 = [arr objectAtIndex:0];
     // 或 
     NSString *str0 = arr[0];
     
     // 返回数组个数  
     NSLog(@"arr count :%d", [ar count]);  
     
     // 追加成员并返回新的array对象
     
     NSArray *arr2 = [arr arrayByAddingObject:@"August"];  
     NSLog(@"arr2 :%@", arr2);
     
     // 是否包含指定对象  
     NSLog(@"isContains :%d", [arr containsObject:@"April"]);
     
     // 查找某个成员所在索引,若成员不存在则返回-1
     NSLog(@"indexOfObject :%d",[arr indexOfObject:@"August"]);
     
     // 返回第一个或最后一个元素  
     NSLog(@"firstObject:%@,lastObejct :%@", [arr firstObject] , [arr lastObject]);
      
      // ...

到目前为止,所介绍的常用到的 Foundation 类依然是比较少的,我们会在后面的文章中继续介绍。

结尾插个话:我发现 OC 中好像并没有严格意义上的方法重载,我们注意到, OC 的方法名总是因为行参变化而改变,实际上就是两个不同的方法。

本文的内容忽略了一个问题:内存引用计数的问题,因为前两篇文章已经说了,OC的内存管理需要手动管理, javapython 中则不存在这个问题。我们在后面的内容中再讨论吧。

参考文档:

NSString 常用方法

苹果官方文档:NSNumber Class Reference

苹果官方文档:NSArray Class Reference

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/15792.html

相关文章

  • iOS学习笔记 Objective-C (一)

    摘要:按照惯例了来一段分析文件不是保存为而是保存为格式的,头文件扩展名则不变。入口程序,为启动时接受的命令行参数,这个不用多说。这个字符在开发中非常常见,它代表这是一个语法。顾名思义是完成初始化。 刚接触 iOS 开发,作为菜鸟,感觉知识点是不少的,有必要进行整理。这里暂时只说针对iPhone的开发吧,iWatch神马的…… 工具和语言 先说Objective-C吧,虽然Apple发布了Sw...

    peixn 评论0 收藏0
  • iOS学习笔记 Objective-C (二)

    摘要:和或中的相同,代表空对象,并不会存在于内存中,所以当时,指针将不会指向内存中的任何一个区域。和在使用上是没有严格限定的,它们俩可以相互替代。另外还有权限变量在框架内为,对于框架外则是私有的。 上一篇文章 结尾草草地写了这么个Demo:定义一个Student类,实例化出一个xiaoming的对象,并同时使用python和java与Objective-C实现它们。这段代码只是演示了一些最...

    Benedict Evans 评论0 收藏0
  • SegmentFault 技术周刊 Vol.7 - iOS丨好好学习,从娃抓起~

    摘要:最近,阿温家小娃出生,让他当了一回公司的热议人物。还在高速,结果娃已经阿温突然在群里发了言,打破了公司群的宁静。儿子比手机先到啊阿温先生紧接着又发了个言,原来本该月中旬出生的娃,提前来到了这个世界。 showImg(https://segmentfault.com/img/remote/1460000007021306?w=690&h=295); 我有一程序员朋友阿温,92 年,高个子...

    bluesky 评论0 收藏0
  • iOS - 收藏集 - 掘金

    摘要:动画系列之五基础动画之缩放篇旋转篇掘金这一篇主要介绍基础动画之缩放和旋转。本文主要会基于一些开源代码和个人实践,对功能性和实用性均佳,应用领域广泛的幻灯片播放库掘金的多选掘金好久 PPAsyncDrawingKit - 实现了一系列基础 UI 控件的轻量级 ASDK - iOS - 掘金一年 iOS,求职中,上海地区,邮箱:dskcpp@gmail.com PPAsyncDrawing...

    dingda 评论0 收藏0
  • iOS 学习参考资料

    摘要:开发马上着手开发应用程序苹果官方入门资料,也有的英文版。官方的文档库,也是最靠谱的资料了,在中也可以下载后直接查阅。当时我看的是的版本,也建议任何学习资料要看要以后版本的,因为其引入了,在内存管理方面和以前的方式有很大的不同。 编程语言 Programming with Objective-C: About Objective-C : Apple 撰写的一份关于 Objective-...

    张迁 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<