OC中的数字、字符串与集合

本文详细介绍了Objective-C中数字、字符串和集合对象的使用,包括NSInteger和NSUInteger的区别,NSNumber的创建和检索,NSString的描述方法,可变字符串NSMutableString的操作,以及数组、词典和集合的基本操作和枚举方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数字、字符串和集合

数字对象

基本数据类型都不是对象,也就是说不能向他们发送消息。

int、NSInteger的区别

NSInteger会自动识别当前电脑系统是32位还是64位数,然后自动返回最大的类型(int还是NSInteger)。

例如,当前电脑为32位系统,你声明的NSInteger自动变为int。当前电脑为64位系统,你声明的NSInteger还是NSInteger。

备注:在多数情况下一定尽可能的使用NSInteger

NSInteger、NSUInteger的区别

NSInteger是有符号整形,即声明的变量既可以是正数也可以是负数。

NSUInteger是无符号整形,即声明的变量只能是正数,比如取值数组下标,可以使用来声明NSUInteger。

#import <Foundation/Foundation.h>


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"这是一个测试数字对象的程序...");
        NSNumber *myNumber, *floatNumber, *intNumber;
        NSInteger myInt;
        // integer 型值
        intNumber = [NSNumber numberWithInteger:100];//表示创建一个值为100的整数对象
        myInt = [intNumber integerValue];//获取储存在intNumber中的整形值,将她储存在NSInteger变量myInt中
        NSLog(@"%li",(long)myInt);
        // long 值
        myNumber = [NSNumber numberWithLong:0xabcdef];
        NSLog(@"%lx",[myNumber longValue]);
        //char 值
        myNumber = [NSNumber numberWithChar:'X'];
        NSLog(@"%c",[myNumber charValue]);
        // float 值
        floatNumber = [NSNumber numberWithFloat:100.00];
        NSLog(@"%f",[floatNumber floatValue]);
        // double 值
        myNumber = [NSNumber numberWithDouble:12345e+15];
        NSLog(@"%lg",[myNumber doubleValue]);
        //验证两个number是否相等
        if([intNumber isEqualToNumber:floatNumber] == YES)
            NSLog(@"相等");
        else
            NSLog(@"不相等");
        //验证一个number是否小于、等于或大于另一个number
        if([intNumber compare:myNumber] == NSOrderedAscending)
            NSLog(@"第一个比第二个大");
    }
    return 0;
}
NSNumber 的创建、检索方法
创建和初始化方法初始化实例方法检索实例方法
numberWith数据类型initWith数据类型数据类型Value

允许使用@表达式创建数字对象。

  intNumber = [NSNumber numberWithInteger:100];//表示创建一个值为100的整数对象
  intNumber = @100;//同上语句一致

字符串对象

要使用 Objective - C 语言创建一个字符串对象,需要在字符串开头放置一个 @ 字符。

NSLog函数
        NSString *str = @"test1";
        NSLog(@"%@",str);

字符串常量 test 被赋值给 NSString 变量 str。之后使用NSLog显示他的值。

description方法
-(NSString *) description{
            return [NSString stringwithformat: @"%i/%i",fenzi,fenmu];
        }

你可以使用格式化字符 %@ 显示数组、字典和集合的全部内容,事实上,通过覆盖 description方法 还可以用这些格式的字符显示你自己类的对象。

类似于 stringwithformat: 这样的方法允许提供多个参数。这些参数使用一系列逗号分隔提供给方法。


2022年9月1日

可变对象和不可变对象

创建字符串对象的时候,会创建一个内容不可更改的对象,称为不可变对象。可以使用NSString 类来处理不可变字符串。你经常需要处理字符串并更改字符串中的字符。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"这是一个测试字符串对象方法的小程序...");
        NSString *str1 = @"This is string A";//创建一个字符串A
        NSString *str2 = @"This is string B";//创建一个字符串B
        NSString *res;
        NSComparisonResult compareResult;  //用于保存后面执行的字符串操作比较的结果
        //计算字符串中的字符
        NSLog(@"字符串A的长度:%lu",[str1 length]);
        //将一个字符串复制到另一个字符串
        res = [NSString stringWithString:str1];
        NSLog(@"复制:%@",res);
        //将一个字符串复制到另一个字符串末尾
        str2 = [str1 stringByAppendingString:str2];
        NSLog(@"链接: %@",str2);
        //验证两个字符串是否相等
        if([str1 isEqualToString:res] == YES)
            NSLog(@"str1 == res");
        else
            NSLog(@"str1 != res");
        //验证一个字符串是否小于、等于或大于另一个字符串
        compareResult = [str1 compare:str2];
        if(compareResult == NSOrderedAscending)
            NSLog(@"str1 < str2");
        if(compareResult == NSOrderedSame)
            NSLog(@"str1 == str2");
        else
            NSLog(@"str1 > str2");
        //将字符串转化为大写
        res = [str1 uppercaseString];
        NSLog(@"字符串转化为大写:%s", [res UTF8String]);
        //将字符串转化为小写
        res = [str1 lowercaseString];
        NSLog(@"字符串转化为小写:%@",res);
        NSLog(@"初始字符串版本为:%@",str1);
        
        
    }
    return 0;
}
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"这是一个测试字符串对象方法的小程序...");
        NSString *str1 = @"This is string A";//创建一个字符串A
        NSString *str2 = @"This is string B";//创建一个字符串B
        NSString *res;
        NSRange subRange;
        NSComparisonResult compareResult;  //用于保存后面执行的字符串操作比较的结果
        //计算字符串中的字符
        NSLog(@"字符串A的长度:%lu",[str1 length]);
        //将一个字符串复制到另一个字符串
        res = [NSString stringWithString:str1];
        NSLog(@"复制:%@",res);
        //将一个字符串复制到另一个字符串末尾
        str2 = [str1 stringByAppendingString:str2];
        NSLog(@"链接: %@",str2);
        //验证两个字符串是否相等
        if([str1 isEqualToString:res] == YES)
            NSLog(@"str1 == res");
        else
            NSLog(@"str1 != res");
        //验证一个字符串是否小于、等于或大于另一个字符串
        compareResult = [str1 compare:str2];
        if(compareResult == NSOrderedAscending)
            NSLog(@"str1 < str2");
        if(compareResult == NSOrderedSame)
            NSLog(@"str1 == str2");
        else
            NSLog(@"str1 > str2");
        //将字符串转化为大写
        res = [str1 uppercaseString];
        NSLog(@"字符串转化为大写:%s", [res UTF8String]);
        //将字符串转化为小写
        res = [str1 lowercaseString];
        NSLog(@"字符串转化为小写:%@",res);
        NSLog(@"初始字符串版本为:%@",str1);
        //从字符串中提取前3个字符
        res = [str1 substringToIndex:3];
        NSLog(@"前三个字符为:%@",res);
        // 提取从索引5开始直到结尾的字符串
        res = [str1 substringFromIndex:5];
        NSLog(@"索引5之后的字符串:%@",res);
        // 提取从索引5到索引13到子字符串
        res = [[str1 substringFromIndex:8] substringToIndex:6];
        NSLog(@"从索引5到13到字符串:%@",res);
        // 更简单的方法
        res = [str1 substringWithRange:NSMakeRange(8, 6)];
        NSLog(@"从索引5到13到字符串:%@",res);
        //从另一个字符串查抄一个字符串
        subRange = [str1 rangeOfString:@"string A"];
        NSLog(@"string 在索引 %lu,长度是%lu",subRange.location,subRange.length);
        subRange = [str1 rangeOfString:@"string B"];
        if(subRange.location == NSNotFound)
            NSLog(@"未找到字符串。");
        else
            NSLog(@"string 在索引 %lu,长度是%lu",subRange.location,subRange.length);
        
        
        
        
    }
    return 0;
}

substringToIndex: 其中参数3代表的是,提取三个;如果提供的索引数对该字符串无效,就会出错。 Range or index out of bounds

substringFromIndex: 返回一个字符串,从接收者指定的索引字符开始,直到字符串结尾。

substringWithRange: 使用特殊函数 NSMakeRange(8, 6) 代表从索引8开始,截取字符串长度为6。

rangeOfString: 用来在一个字符串中查找另一个字符串,返回的是 NSRange 变量,所以必须使用一个同类型的参数接收它。

注意到 NSRange 变量,其是一个结构体,其定义为:

typedef struct _NSRange
{
   NSUInteger location;
   NSUInteger length;
} NSRange;

NSRange 用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围
NSRange 有2个成员
NSUInteger location : 表示该范围的起始位置
NSUInteger length : 表示该范围内的长度

可变字符串NSMutableString的介绍

NSMutableString 类可以用来创建可以更改字符的字符串对象。

NSMutableString 类继承 NSString 类。

NSMutableStringNSString 的区别:

  1. NSString 是不可变的,里面的文字内容是不能进行修改的;
  2. NSMutableString 是可变的,里面的文字内容可以随时更改;
  3. NSMutableString 能使用 NSString 的所有方法继承

关于可变不可变的解释:

不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化

可变: 指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改

以下是可变字符串的基本操作:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"这是一个演示可变字符串基本操作的程序...");
        NSString *str1 = @"this is string A";
        NSString *search,*replace;
        NSMutableString *mstr;//创建可变字符串
        NSRange substr;//创建表示元素范围的字符串
        
        //从不可变字符串创建可变字符串
        mstr = [NSMutableString stringWithString:str1];
        NSLog(@"%@",mstr);
        //插入字符
        [mstr insertString:@"mutable" atIndex:7];//在索引数7处插入字符串
        NSLog(@"%@",mstr);
        //插入末尾进行有效拼接
        [mstr insertString:@" and string B" atIndex:[mstr length]];//通过调用length在字符串结尾处插入字符串
        NSLog(@"%@",mstr);
        //直接使用appendString
        [mstr appendString:@" and string C"];
        NSLog(@"%@",mstr);
        //根据范围删除字符串
        [mstr deleteCharactersInRange:NSMakeRange(16, 13)]; //从索引16处开始,删除十三个字符。
        NSLog(@"%@",mstr);
        //查找然后将其删除
        substr = [mstr rangeOfString:@"string B and"];
        if(substr.location != NSNotFound){//首先验证mstr中存在字符串string B and
            [mstr deleteCharactersInRange:substr];
            NSLog(@"%@",mstr);
        }
        //直接设置为可变字符串
        [mstr setString:@"this is string A"];
        NSLog(@"%@",mstr);
        //替换一些字符
        [mstr replaceCharactersInRange:NSMakeRange(8, 8) withString:@"a mutable string"];
        NSLog(@"%@",mstr);
        //查找和替换
        search = @"this is";
        replace = @"an example of";
        substr = [mstr rangeOfString:search];
        if(substr.location != NSNotFound){
            [mstr replaceCharactersInRange:substr withString:replace];
            NSLog(@"%@",mstr);
        }
        //查找和替换所有的匹配项
        search = @"a";
        replace = @"X";
        substr = [mstr rangeOfString:search];
        while (substr.location != NSNotFound) {
            [mstr replaceCharactersInRange:substr withString:replace];
            substr = [mstr rangeOfString:search];
            
        }
        NSLog(@"%@",mstr);
        
    }
    return 0;
}

其中,查找和替换的 while 循环可以替换为:

 [mstr replaceOccurrencesOfString:search withString:replace options:nil range:NSMakeRange(0, [mstr length])];

数组对象

Foundation 数组是有序对象集合。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        int i;
        NSLog(@"这是一个测试数组对象的程序....");
        //首先创建一个包含各个月份名称的数组
        NSArray *monthNames =@[@"一月",@"一月",@"二月",@"三月",@"四月",@"五月",@"六月",@"七月",@"八月",@"九月",@"十月",@"十一月",@"十二月"];
        //列出数组中所有的元素
        NSLog(@" 月 份 名 称 ");
        NSLog(@"============");
        for(i = 0;i < 12; ++i ){
            NSLog(@" %2i %@", i+1 ,monthNames[i]);
        }
    }
    return 0;
}
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableArray *numbers = [NSMutableArray array];
        //创建0~9数字的数组
        for(int i = 0;i < 10; ++i){
            numbers[i] = @(i);
        }
        for(int i = 0;i < 10; ++i){
            NSLog(@"%@",numbers[i]);
        }
        NSLog(@"使用带有格式的nslog显示");
        NSLog(@"%@",numbers);
    }
    return 0;
}

之前提到过,不能将整数这样的基本数据类型存储在数组之类的集合中。所以我们要构造每个值 iNSNumber 对象,范围从09

如果需要向数组末尾添加一个对象,可以使用 addObject 方法。

[numbers addObject:@(i)];
快速枚举
for( AddressCard *theCard in _book)
        NSLog(@"%-20s %-30s",[theCard.name UTF8String],[theCard.email UTF8String]);

这里对数组 book 中的每一个元素序列使用名为快速枚举的技术。他的语法非常简单:

首先定义一个能够保留数组中每个元素的变量,使用关键字 in ,然后列出数组的名称。

词典对象

词典** dictionary **是由键-对象组成的数据集合。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"这是一个测试词典对象的程序...");
        NSMutableDictionary *myDictionary = [NSMutableDictionary new];
        [myDictionary setObject:@"测试查找结果1" forKey:@"1"];
        [myDictionary setObject:@"测试查找结果2" forKey:@"2"];
        [myDictionary setObject:@"测试查找结果3" forKey:@"3"];
        [myDictionary setObject:@"测试查找结果4" forKey:@"4"];
        NSLog(@"1.%@",[myDictionary objectForKey:@"1"]);
        NSLog(@"2.%@",[myDictionary objectForKey:@"2"]);
        NSLog(@"3.%@",[myDictionary objectForKey:@"3"]);
        NSLog(@"4.%@",[myDictionary objectForKey:@"4"]);
        myDictionary [@"新的测试1" ] = @"新的测试结果1";
        myDictionary [@"新的测试2" ] = @"新的测试结果2";
        myDictionary [@"新的测试3" ] = @"新的测试结果3";
        myDictionary [@"新的测试4" ] = @"新的测试结果4";
        NSLog(@"新的测试1: %@",myDictionary [@"新的测试1" ]);
        NSLog(@"新的测试2: %@",myDictionary [@"新的测试2" ]);
        NSLog(@"新的测试3: %@",myDictionary [@"新的测试3" ]);
        NSLog(@"新的测试4: %@",myDictionary [@"新的测试4" ]);
        
        
        
    }
    return 0;
}

以上两种检索方法:

[myDictionary setObject:@“查找结果” forKey:@“查找关键词”];

NSLog(@“%@”,[myDictionary objectForKey:@“查找关键词”]); 此行输出结果

myDictionary [@“查找关键词” ] = @“查找结果”;

NSLog(@" %@",myDictionary [@“查找关键词” ]); 此行输出结果

枚举词典

使用 dictionaryWithObjectsAndKeys:方法创建带有初始键值对的词典,也就是不可变的词典。

        NSDictionary *myDictionary1 =
        [NSDictionary dictionaryWithObjectsAndKeys:
        @"输出结果测试1",
        @"测试1",
        @"输出结果测试2",
        @"测试2",
        @"输出结果测试3",
        @"测试3",
         nil];
        for (NSString *key in myDictionary1)
            NSLog(@"%@ : %@",key,[myDictionary1 objectForKey:key]);

同时也可以使用特殊语法:

{ key1 : object1, key2 : object2,  ....   keyn : objectn }

集合对象

#import <Foundation/Foundation.h>
@interface NSSet (Printing)
-(void) print;
@end

@implementation NSSet (Printing)

-(void) print{
    printf("{");
    for(NSNumber *yuansu in self)
        printf(" %li ",(long) [yuansu integerValue]);
    printf("}  \n");
    
}

@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"这是一个测试集合对象的程序...");
        NSMutableSet *jihe1 = [NSMutableSet setWithObjects: @1,@3,@5,@10,nil];
        NSMutableSet *jihe2 = [NSMutableSet setWithObjects: @3,@-5,@100,@5,nil];
        NSMutableSet *jihe3 = [NSMutableSet setWithObjects: @12,@200,@3,nil];
        NSLog(@"集合1:");
        [jihe1 print];
        NSLog(@"集合2:");
        [jihe2 print];
        //相等性测试
        if([jihe1 isEqualToSet:jihe2] == YES)
            NSLog(@"集合1等于集合2");
        else
            NSLog(@"集合1不等于集合2");
        //成员测试
        if([jihe1 containsObject:@10] == YES)
            NSLog(@"集合1中包含元素10");
        else
            NSLog(@"集合1中不包含元素10");
        if([jihe2 containsObject:@10] == YES)
            NSLog(@"集合2中包含元素10");
        else
            NSLog(@"集合2中包含元素10");
        //在可变集合1中添加和移除对象
        [jihe1 addObject:@"4"];
        [jihe2 removeObject:@"10"];
        NSLog(@"添加元素4删除元素10后的集合1为:");
        [jihe1 print];
        //获得两个集合的交集
        [jihe1 intersectSet:jihe2];
        NSLog(@"集合1和集合2的交集为:");
        [jihe1 print];
        //获得两个集合的并集
        [jihe1 unionSet:jihe3];
        NSLog(@"集合1和集合3的并集为:");
        [jihe1 print];
        
        
            
  
    }
    return 0;
}

其中 print: 方法用到了之前的快速枚举的技术,从集合中提取每个元素。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值