//
// main.m
// GuoQingSecondDayString
//
// Created by 千雅爸爸 on 16/10/2.
// Copyright © 2016年 kodulf. All rights reserved.
//
//可变字符串和不可变字符串
//不可变字符串的NSString
//0:创建
//1:格式化
//2:评介
//3:分隔
//4:获取子字符串
//5:字符串比较
//6:字符串长度
//7:以什么开始
//8:以什么结尾
//9:大写
//
//
//和java的区别
//可变数组相当于java中的ArrayList,可变字典相当于java中的hashmap
// 0:不可变字符串的创建
// 不可变字符串指的是字符和长度不可变。但是地址是可变的。
// 可以直接创建NSString *string = @"string";
// 也可以通过[NSString stringWithFormat:@"%@", @"hello"];
// string = @"bb";
// NSString newString = @"bb";
// 这个时候string 和newString的地址是一样的
// 这个和java一样
//2:拼接,java直接使用+的符号,oc有三种方法,
//第一种是使用格式化的方法
//第二种是stringByAppendingString
//第三种是stringByAppendingFormat
//5:字符串比较
//和java一样的==比较的是地址,
//正式的判断两个字符的值是否相等的是 if([stringcompare1 compare:stringcompare2] == NSOrderedSame)
//其他的属性例如,以什么开始,hasprefix,以什么结束hassuffix,长度,大写都和java很类似的。
//数组的获取某个位置上面的值的方法可以和java一样array[0]这样,也可以是[nsarray2 objectAtIndex:0]
//注意方法有多个参数的时候,中间不要逗号隔开,这个和java有区别
//+(instancetype)initPersonWithName:(NSString *)name age:(NSUInteger)mage;
//0:不可变的字典的创建,一定要注意的是使用dictionaryWithObjectsAndKeys这个创建的时候是value key的形式来添加的和java不一样,但是使用最简方式创建的时候就是和java一样的,key value的形式,其实可以看上面的方法的名字也就明白了
// 获取指定的值,可以dic[@"key"]这个来做
//不可变字典可以获取对应value的key,java中没有这种方法。
//NSDictionary *dic5 = @{@"key1":@"value2",@"key2":@"value2"};
//NSArray *allkeysForOneValueArray = [dic5 allKeysForObject:@"value2"];
//NSLog(@"所有的value是value2的key:%@",allkeysForOneValueArray);
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 0:不可变字符串的创建
// 不可变字符串指的是字符和长度不可变。但是地址是可变的。
// 可以直接创建NSString *string = @"string";
// 也可以通过[NSString stringWithFormat:@"%@", @"hello"];
// string = @"bb";
// NSString newString = @"bb";
// 这个时候string 和newString的地址是一样的
// 这个和java一样
NSLog(@"0:创建");
NSString *string = @"hello";
NSLog(@"创建第一个string%@ string=",string);
NSString *secondString = @"hello";
NSLog(@"使用直接的方法创建第二个String second=String%@",secondString);
//判断地址是否一样
if(string == secondString){
NSLog(@"string secondString 的地址相同");
}else{
NSLog(@"string secondString 的地址不相同");
}
//使用stringWithFormat
NSString *thirdString = [NSString stringWithFormat:@"%@", @"hello"];
NSLog(@"使用stringWithFormat 方法创建第三个string=%@",thirdString);
//可以将c语言字符串变成我们的oc字符串
[NSString stringWithFormat:@"%@", @"hello"];
const char *cstring = "hello c program";
//通过类方法
NSString *formatedCstring = [NSString stringWithCString:cstring encoding:NSUTF8StringEncoding];
NSLog(@"通过类方法,使用stringWithCString的方法来做的 c语言字符串=%@",formatedCstring);
//通过[NSString alloc] initWithCString方法
NSString *cString2=[[NSString alloc] initWithCString:cstring encoding:NSUTF8StringEncoding];
NSLog(@"通过实例方法,使用[NSString alloc] initWithCString的方法来做的 c语言字符串=%@",cString2);
//1:格式化
NSString *formatedString = [NSString stringWithFormat:@"%@",@"格式化输出"];
NSLog(@"%@",formatedString);
//2:拼接,java直接使用+的符号,oc有三种方法,
//第一种是使用格式化的方法
//第二种是stringByAppendingString
//第三种是stringByAppendingFormat
NSString *appendTestString =[NSString stringWithFormat:@"%@",@"字符串拼接"];
NSString *afterAppend = [appendTestString stringByAppendingString:@" stringByAppendingString方法的字符串"];
NSLog(@"%@",afterAppend);
NSString *afterAppend2 = [appendTestString stringByAppendingFormat:@"stringByAppendingFormat %@ %@",@"格式化1",@"格式化二"];
NSLog(@"%@",afterAppend2);
//3:分隔,分为单个分隔和多个分隔
NSString *webaddress =@"I love you";
NSArray *array = [webaddress componentsSeparatedByString:@" "];
NSLog(@"以空格来分隔后,分割后的字符串:%@",array);
NSString *newWebAddress = [webaddress stringByAppendingString:@" . www.baidu.com"];
//多个分隔符,需要用到NSCharacterSet的类方法来获取set,
NSArray *newarray = [newWebAddress componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" ." ]];
NSLog(@"以空格和点来分隔后,分割后的字符串:%@",newarray);
//4:获取子字符串
NSString *subString =[webaddress substringFromIndex:1];
NSLog(@"从第一个元素往后的字符串%@",subString);
NSString *subString2 = [webaddress substringToIndex:6];
NSLog(@"从第六个元素之前的字符串%@",subString2);
//注意这里的NSMakeRange,这个java 里面也有,但是是直接使用某个区间的,而不用单独的一个变量
NSString *subString3 = [webaddress substringWithRange:NSMakeRange(0,5)];
NSLog(@"使用substringWithRange:NSMakeRange(0,5) 来获取的子字符串=%@",subString3);
//5:字符串比较
//和java一样的==比较的是地址,
NSString *stringcompare1 = @"hello world";
NSString *stringcompare2 = @"hello world";
if(stringcompare1 == stringcompare2){
NSLog(@"相等");
}
NSString *stringCompare3 = [NSString stringWithFormat:@"hello world two"];
NSString *stringCompare4 = [NSString stringWithFormat:@"hello world"];
NSComparisonResult result = [stringCompare3 compare:stringcompare1];
switch(result){
case NSOrderedAscending:
NSLog(@"升序");
break;
case NSOrderedDescending:
NSLog(@"降序");
break;
case NSOrderedSame:
NSLog(@"相等");
break;
}
//上面缩减为
if([stringcompare1 compare:stringcompare2] == NSOrderedSame){
NSLog(@"相等");
}
//6:字符串长度
NSLog(@"字符串长度=%lu",(unsigned long)[stringcompare2 length]);
//7:以什么开始,和java的startwith一样
BOOL b = [stringcompare2 hasPrefix:@"hello"];
if(b == true){
NSLog(@"是以hello 开头的");
}else{
NSLog(@"不是以hello 开头的");
}
//8:以什么结尾
BOOL a = [stringcompare2 hasSuffix:@"world"];
if(a == true){
NSLog(@"是以world 结尾的");
}else{
NSLog(@"不是以world 结尾的");
}
//9:大写
NSString *upperString = [stringcompare2 uppercaseString];
NSLog(@"大写的=%@",upperString);
//10, 查看字符串中的子的字符串的位置
NSRange range = [stringcompare2 rangeOfString:@"world"];
NSLog(@"world 在里面的位置%lui",(unsigned long)range.length);
//不可以直接输出:NSLog(@"%@",range);
if (range.length > 0)
NSLog(@"Range is: %@", NSStringFromRange(range));
//可变字符串,就相当于是java的stringbuilder
//需要注意的是这个可变的字符串是不可以使用@“”来直接赋值的
//NSString 不可以直接使用alloc init ,NSMutableString是可以的
NSMutableString *mString = [[NSMutableString alloc]initWithCapacity:40];
[mString setString:@"可变字符串"];
NSLog(@"%@",mString);
//注意setString不能使用nil,如果使用了,那么就会报错Thread 1:signal SIGABRT
//[mString setString:nil];
//NSLog(@"%@",mString);
//追加字符串
[mString appendString:@"追加的字符串啦啦啦啦"];
NSLog(@"%@",mString);
//在某个位置插入字符串,从0开始算
[mString insertString:@"在第一位置插入" atIndex:0];
NSLog(@"%@",mString);
//删除某一部分的,
//PS创建NSRange NSRange range2 = NSMakeRange(10, 2);
//输出NSRange,NSLog(@"Range is: %@", NSStringFromRange(range));
NSRange range2 = NSMakeRange(0, 10);
[mString deleteCharactersInRange:range2];
NSLog(@"%@",mString);
//替换
NSRange range3 = NSMakeRange(0,2);
[mString replaceCharactersInRange:range3 withString:@"替换后的文字,哈哈哈哈"];
NSLog(@"%@",mString);
//++++++++++++数组+++++++++++++++++
//不可变数组,可变数组相当于java中的arraylist
//oc中有序集合是数组,无序集合是字典,set
//不可变数组的不可变,指的是数组的个数和类型不可变
//0:创建,
//1:指定位置的获取
//2:遍历
//3:枚举
//4:排序
//5:首尾的访问
//6:数组的拼接
//7:可变数组的创建
//8:可变数组的晴空
//9:可变数组的替换
//0:创建,可以有3种方法,
//第一种:
NSArray *nsarray = [[NSArray alloc] initWithObjects:@"a",@"b",@"c", nil];
NSLog(@"%@",nsarray);
//第二种:最简化方式,注意这里不需要nil的,系统会自动的添加nil
NSArray *nsarray2 = @[@"1",@"2",@"3"];
NSLog(@"%@",nsarray2);
//第三种:arrayWithObject
NSArray *nsarray3 = [NSArray arrayWithObjects:@"4", nil];
NSLog(@"%@",nsarray3);
//1:获取数组种某个位置的值
//如果这个类型已经知道了,那么就该类型,如果不知道就用范型id
NSString *firstString =[nsarray2 objectAtIndex:0];
NSLog(@"数组的第一个值:%@",firstString);
id object = [nsarray2 objectAtIndex:0];
NSLog(@"不知道类型的情况下的数组的第一个值:%@",object);
//获取数组某个位置值的第二种方法,和java一样数组名加上[]
NSString *firstStringsecond = nsarray2[0];
NSLog(@"使用array[]的方式获取的数组的第一个%@",firstStringsecond);
//2:遍历
//使用两种方法:第一种for 循环,第二种是forin循环
NSArray *bianliarray = @[@"啊",@"宝",@"长"];//这里使用最简化方式
for (NSInteger i = 0; i<bianliarray.count; i++) {
NSLog(@"数组的第%ld个元素是%@",(long)i,bianliarray[i]);
}
for (NSString *object in bianliarray) {
NSLog(@"forin循环遍历的元素:%@",object);
}
//3:枚举
NSArray *meijuarray = @[@"枚举0",@"枚举1",@"枚举2"];
NSEnumerator *emuator = [meijuarray objectEnumerator];
NSObject *enumobject = emuator.nextObject;
while (enumobject) {
NSLog(@"枚举的元素:%@",enumobject);
enumobject = emuator.nextObject;
}
//4:排序,有三种方法
NSArray *paixuarray = @[@"azc",@"abd",@"acd",@"abc"];
NSArray *paixuhouarray = [paixuarray sortedArrayUsingSelector:@selector(compare:)];//compare就是值得字符串比较方法
NSLog(@"排序后的数组:%@",paixuhouarray);
//自定义对象的排序
//首先创建一个自定义的对象person
Person *person1 = [Person initPersonWithName:@"test name 2" age:12];
Person *person2 = [Person initPersonWithName:@"test name 1" age:13];
Person *person3 = [Person initPersonWithName:@"test name 2" age:11];
NSArray *zidingyiarray = @[person1,person2,person3];
//下面的selector 里面使用的是我们的Person里面的
NSArray *zidingyiarrayupdate = [zidingyiarray sortedArrayUsingSelector:@selector(comparePerson:)];
NSLog(@"自动更新后的%@",zidingyiarrayupdate);
//第二种方法排序,使用descript来排序
//https://my.oschina.net/pengloo53/blog/173810
//把排序描述器放进数组里,放入的顺序就是你想要排序的顺序
NSSortDescriptor *description1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:true];
NSSortDescriptor *description2 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:true];
NSArray *descriptionArray = [NSArray arrayWithObjects:description1,description2,nil];
NSArray *afterdescriptionsorted = [zidingyiarray sortedArrayUsingDescriptors:descriptionArray];
NSLog(@"%@",afterdescriptionsorted);
//5:首尾的访问
NSArray *getFirstEndArray= @[@"first",@"second",@"end"];
NSString *firststring = [getFirstEndArray firstObject];
NSString *endstring = [getFirstEndArray lastObject];
NSLog(@"第一个数据是%@ 最后一个数据是%@",firststring,endstring);
//6:数组的拼接
NSString *iloveu = @"i love u";
NSArray *seperatedArray = [iloveu componentsSeparatedByString:@" "];
NSLog(@"分隔后的string%@",seperatedArray);
NSString *afterJoinString = [seperatedArray componentsJoinedByString:@"+"];
NSLog(@"拼接后的字符串%@" ,afterJoinString);
//7:可变数组的创建以及添加元素,相当于arraylist
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"A",@"B",@"C", nil];
NSLog(@"添加前的%@",mArray);
[mArray addObject:@"D"];
NSLog(@"添加后的%@",mArray);
[mArray insertObject:@"insert in the second" atIndex:1];
NSLog(@"指定位置添加后的%@",mArray);
[mArray removeObjectAtIndex:1];
NSLog(@"移除指定位置上的元素后%@",mArray);
for (NSInteger i=0; i<5; i++) {
[mArray addObject:@"add"];
}
NSLog(@"新增5个add以后的%@",mArray);
//如果是removeObject的话会把所有的add都删除
[mArray removeObject:@"add"];
NSLog(@"removerobject add以后的%@",mArray);
//8:可变数组的晴空
[mArray removeAllObjects];
NSLog(@"removeallobject 以后的%@",mArray);
//9:可变数组的替换
NSMutableArray *replaceArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"c",nil];
[replaceArray replaceObjectAtIndex:0 withObject:@"ddddd"];
NSLog(@"替换了第一个a换成dddd 以后的%@",replaceArray);
//不可变字典,相当于java中的haspmap
//++++++++++++++++++++++++++字典+++++++++++++++
//可变字典和不可变字典
//0:创建
//1:获取对应key的value
//2:获取对应value的key
//3:字典的嵌套使用
//4:字典的便利
//5:可变长字典的创建
//6:添加
//7:修改相应的key 对应的value
//8:删除指定的key 对应的value,全删
//0:不可变的字典的创建,一定要注意的是使用dictionaryWithObjectsAndKeys这个创建的时候是value key的形式来添加的和java不一样,但是使用最简方式创建的时候就是和java一样的,key value的形式,其实可以看上面的方法的名字也就明白了
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2" ,@"key2", nil];
NSLog(@"输出的字典:%@",dic);
//最简方式创建的
NSDictionary *dic2 = @{@"key3":@"value3",@"key4":@"value4"};
NSLog(@"输出的字典:%@",dic2);
//如果有数组,需要首先转化为NSNumber的类型,使用数字前面加上@的方式
NSDictionary *dic3 = @{@"numb1":@1,@"numb2":@2};
NSLog(@"输出的字典:%@",dic3);
//如果两个key 有相同的名字,那么后面的会被忽略
NSDictionary *dic4 = @{@"numb1":@1,@"numb2":@2,@"numb2":@3};
NSLog(@"输出的字典:%@",dic4);
//1:获取对应key的value
NSNumber *num2 = [dic4 valueForKey:@"numb2"];
NSLog(@"num2的值是%@",num2);
NSString *numb1Value =dic4[@"numb1"];
NSLog(@"numb1的值%@",numb1Value);
//查看所有的value 和所有的key
NSArray *allValues = [dic4 allValues];
NSArray *allKeys = [dic4 allKeys];
NSLog(@"所有的key:%@\n 所有的value:%@",allKeys,allValues);
//2:不可变字典可以获取对应value的key,java中没有这种方法。
NSDictionary *dic5 = @{@"key1":@"value2",@"key2":@"value2"};
NSArray *allkeysForOneValueArray = [dic5 allKeysForObject:@"value2"];
NSLog(@"所有的value是value2的key:%@",allkeysForOneValueArray);
//3:字典的嵌套使用
NSDictionary *dic6 = @{@"dic1":dic,@"dic4":dic4};
NSLog(@"复合以后的dic6=%@",dic6);
//4:字典的遍历
for (id object in [dic6 allKeys]) {
NSLog(@"forin 循环%@",dic6[object]);
}
//5:可变长字典的创建
NSMutableDictionary *mDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"changeable value",@"changeable key", nil];
NSLog(@"可变字典:%@",mDic);
//6:添加
[mDic addEntriesFromDictionary:dic4];
NSLog(@"从其他的不可变字典添加后的可变字典:%@",mDic);
//新增直接使用setObject来弄,这个setObject还可以用来修改
[mDic setObject:@"bianbianbian" forKey:@"bianbianbian"];
NSLog(@"新增变变变:%@",mDic);
//7:修改相应的key 对应的value,注意前后顺序
[mDic setObject:@"meihaodeshiqingjijiangfasheng" forKey:@"bianbianbian"];
NSLog(@"修改了以后的bianbianbian=%@",mDic);
//8:删除指定的key 对应的value,全删
[mDic removeObjectForKey:@"bianbianbian"];
NSLog(@"删除了变变变以后的%@",mDic);
}
return 0;
}
用到了一个person类:
h文件:
//
// Person.h
// GuoQingSecondDayString
//
// Created by 千雅爸爸 on 16/10/4.
// Copyright © 2016年 kodulf. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
//注意方法有多个参数的时候,中间不要逗号隔开,这个和java有区别
+(instancetype)initPersonWithName:(NSString *)name age:(NSUInteger)mage;
@property(nonatomic,copy) NSString *name;
@property(nonatomic,assign) NSUInteger age;
-(NSComparisonResult)comparePerson:(Person *)person;
@end
m文件:
//
// Person.m
// GuoQingSecondDayString
//
// Created by 千雅爸爸 on 16/10/4.
// Copyright © 2016年 kodulf. All rights reserved.
//
#import "Person.h"
@implementation Person
+(instancetype)initPersonWithName:(NSString *)name age:(NSUInteger)mage{
Person *person = [[self alloc]init];
person.age = mage;
person.name = name;
return person;
}
-(NSComparisonResult)comparePerson:(Person *)person{
NSComparisonResult result = [self.name compare:person.name];
return result;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"name %@,age %ld", self.name,self.age];
}
@end