您的位置:首页 > 移动开发 > IOS开发

NSCharacterSet

2015-12-02 14:57 519 查看
单纯的讨论NSCharacterSet没有意义,因为在实现一个业务的需求下,常常会结合NSString, NSPredicate, NSArray等类来协作。

同时应该好好理解一下,NSSet, NSIndexSet等等之间关系、区别。

@interface NSCharacterSet : NSObject <NSCopying, NSMutableCopying, NSCoding>

可以看到,NSCharacterSet是直接继承自NSObject的,其实和NSSet是没有什么太大关系的呢。
而set这个概念,和数组最大的区别还是集合的特点,唯一性。

非常好的文章:http://nshipster.cn/nscharacterset/

NSString *string = @" Lorem ipsum dolar sit amet. ";

//把前后的两个字符空格去掉
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

//以空格为基准将字符串的内容分离,使得字符串在数组以独立的形式出现,
//注意到这里,如果字符间存在多个空格,剔除一个后会作为处理的对象来对待
NSArray *components = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

NSLog(@"components : %@", components);

//'过滤器',用正则表达式将他们间的多余空格剔除, 剔除的要求就是 ''
components = [components filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self <> ''"]];

NSLog(@"components : %@", components);

//将得到的数组连接起来
string = [components componentsJoinedByString:@""];

NSLog(@"what happens : %@", string);

还有可变的:NSMutableCharacterSet,在不可变的前提下增加了一个invert倒置的方法。
NSMutableCharacterSet *base = [NSMutableCharacterSet lowercaseLetterCharacterSet]; //小写字母
NSCharacterSet *decimalDigit = [NSCharacterSet decimalDigitCharacterSet]; //十进制数字
[base formUnionWithCharacterSet:decimalDigit]; //字母加十进制

//用上面的base隔开string然后组成一个数组,然后通过componentsJoinedByString,来连接成一个字符串
NSString *string = @"ax@d5s#@sfn$5`SF$$%x^(#e{]e";

NSArray* componentArray = [string componentsSeparatedByCharactersInSet:base];

NSLog(@"componentArray is : %@", componentArray);

NSString* componentString = [componentArray componentsJoinedByString:@"-"];

NSLog(@"componentString is : %@", componentString);

//----------------

[base invert];

NSArray* invertComponentArray = [string componentsSeparatedByCharactersInSet:base];

NSLog(@"invertComponentArray is : %@", invertComponentArray);

NSString* invertComponentString = [invertComponentArray componentsJoinedByString:@"-"];

NSLog(@"invertComponentString is : %@", invertComponentString);

结果如下:



这里需要讲解一下的是这个方法:

- (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator NS_AVAILABLE(10_5, 2_0);


细心看就知道separator的意义是什么:
例如:

NSString *string = @" Lorem ipsum dolar sit amet. ";

string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

NSArray *components = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

输出结果:



前后的空格stringByTrim消除了,而后操作的字符为 : Lorem    ipsum dolar   sit  amet.  其中它们间的空格分别为:4 , 1, 3, 2

可以看到输出结果 "" 分别有:3 , 0 , 2 , 1  ,其实就是separator的意义是要用一个空格作为分离的 “代价”, 所以他们之间减去了一。

同理上面的:

NSString *string = @"ax@d5s#@sfn$5`SF$$%x^(#e{]e";

NSArray* componentArray = [string componentsSeparatedByCharactersInSet:base];因为base 的character集是基于小写字母和十进制数,并且首尾并没有分离,所以保留,这样分析就很好得出结论了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS NSCharacterSet