Objective-C的NSString学习笔记

NSString - 字符串对象

NSString派生自NSObject,一个静态的纯文本Unicode字符串对象。NSString类及其可变子类NSMutableString为处理字符串提供了一组广泛的api,包括用于比较、搜索和修改字符串的方法。NSString对象用于整个Foundation和其他Cocoa框架,作为平台上所有文本和语言功能的基础。

NSString的常用属性
@property (readonly) NSUInteger length;

属性描述调用方中的UTF-16编码单元的数量(字符串长度)。此数字包括组合字符序列的单个字符,因此不能使用此属性确定字符串在打印时是否可见或显示多长时间。

@property (readonly) double doubleValue;

属性描述字符串的浮点值为双精度浮点数。此属性会忽略字符串开头的任何空格,此属性在上溢时为HUGE_VAL或–HUGE_VAL,在下溢时为 0.0。如果字符串不是以浮点数的有效文本表示开头,则此属性为 0.0。此属性使用存储在非本地化值中的格式信息,使用NSScanner对象对字符串中的数值进行本地化扫描。

@property (readonly) float floatValue;

属性描述字符串的浮点值作为浮点数。此属性会忽略字符串开头的任何空格,此属性在上溢时为HUGE_VAL或–HUGE_VAL,在下溢时为 0.0。如果字符串不是以有效的浮点数文本表示形式开头,则此属性为0.0。此属性使用存储在非本地化值中的格式化信息,使用NSScanner对象对字符串中的数值进行本地化扫描。

@property (readonly) int intValue;

属性描述字符串的整数值。字符串的整数值,采用十进制表示,并跳过字符串开头的空格。溢出时此属性为INT_MAX或INT_MIN。如果字符串不是以数字的有效十进制文本表示形式开头,则此属性为0。此属性使用存储在非本地化值中的格式信息,使用NSScanner对象对字符串中的数值进行本地化扫描。

@property (readonly, copy) NSString *uppercaseString;

属性描述字符串的大写表示。此属性执行规范(非本地化)映射。它适用于不依赖于当前区域设置而需要稳定结果的编程操作。大小写转换不能保证是对称的,也不能保证生成与原始字符串长度相同的字符串。当处理呈现给用户的文本时,使用localizedUppercaseString或uppercaseStringWithLocale:代替。

@property (readonly, copy) NSString *lowercaseString;

属性描述字符串的小写表示。此属性执行规范(非本地化)映射,它适用于需要不依赖于当前语言环境的稳定结果的编程操作。不能保证大小写转换是对称的,也不能保证生成与原始字符串相同长度的字符串。当处理呈现给用户的文本时,使用localizedLowercaseString或lowercaseStringWithLocale:代替。

@property (readonly, copy) NSString *capitalizedString;

属性描述字符串的首字母变大写表示形式。每个单词中的第一个字符更改为其对应的大写值,其余所有字符设置为其对应的小写值。单词是由空格、制表符或行结束符分隔的任何字符序列(列在getLineStart:end:contentsEnd:forRange:下)。不考虑某些常用的分隔词标点,因此此属性通常不会为多字字符串生成所需的结果。不能保证大小写转换是对称的,也不能保证生成与原始字符串相同长度的字符串。此属性执行规范(非本地化)映射,它适用于需要不依赖于当前语言环境的稳定结果的编程操作。当处理呈现给用户的文本时,使用localizedCapitalizedString或capitalizedStringWithLocale:代替。

@property (readonly) NSUInteger hash;

属性描述可以用作哈希表地址的无符号整数。如果两个字符串对象相等(由isEqualToString:方法确定),则它们必须具有相同的哈希值,此属性满足此要求。(经典的话一定要会说:两个相等的实例,他们的hash值一定相等。但是hash值相等的两个实例,不一定相等。)

NSString的常用函数
- (instancetype)initWithString:(NSString *)aString;

函数描述 :通过复制另一个给定字符串中的字符来初始化NSString对象。

参数 :

aString : 要从中复制字符的字符串,这个值不能为nil,如果aString为nil则引发一个NSInvalidArgumentException。

返回值 : 通过复制aString中的字符来初始化的NSString对象,返回的对象可能与原始调用方不同。

- (instancetype)initWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);

函数描述返回一个初始化的NSString对象,该对象使用一个给定的格式字符串作为模板,其余的参数值被替换到该模板中。此方法调用initWithFormat:locale:arguments:而不应用任何本地化。

参数 :

format : 一个格式字符串。这个值不能为nil,如果格式为nil,则引发一个NSInvalidArgumentException。

返回值 : 使用format作为模板初始化的NSString对象,其余的参数值将根据系统区域设置替换到该模板中,返回的对象可能与原始调用方不同。

- (instancetype)initWithFormat:(NSString *)format locale:(nullable id)locale arguments:(va_list)argList NS_FORMAT_FUNCTION(1,0);

函数描述返回一个NSString对象,该对象通过使用给定的格式字符串作为模板进行初始化,其余的参数值将根据给定的地区信息替换到该模板中。该方法将在可变参数函数中调用,其中的参数列表将是可用的。

参数 :

format : 一个格式字符串。这个值不能为nil,如果格式为nil,则引发一个NSInvalidArgumentException。

locale : 指定要使用的语言环境的NSLocale对象。要使用当前语言环境(由用户首选项指定),请传递[NSLocale currentLocale]。若要使用系统区域设置,请传递nil。

argList : 要替换为格式的参数列表。

返回值 : 通过使用format作为模板来初始化的NSString对象,argList中的值将根据locale中的locale信息替换为该模板中的值。返回的对象可能与原始器收方不同。

- (nullable instancetype)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;

函数描述 : 返回通过使用给定编码将给定数据转换为UTF-16代码单元而初始化的NSString对象

参数 :

data : 包含字节编码和默认纯文本格式(即没有属性或其他标记的纯内容)的NSData对象。

encoding : 数据使用的编码。

返回值 : 通过使用编码将数据中的字节转换为UTF-16代码单元而初始化的NSString对象。返回的对象可能与原始调用方不同。如果初始化由于某种原因失败(例如,如果数据不表示要编码的有效数据),则返回nil。

- (nullable instancetype)initWithBytes:(const void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding;

函数描述 :返回一个初始化的NSString对象,该对象包含一个给定字节数,该字节数来自一个以给定编码方式解释的给定字节缓冲区。

参数 :

bytes : 在编码指定的编码中解释的字节缓冲区。

length : 从字节使用的字节数。

encoding : 应用于字节的字符编码。

返回值 : 一个初始化的NSString对象,包含长度字节,这些字节来自使用编码编码解释的字节。返回的对象可能与原始调用方不同。如果字节字符串的长度大于指定长度,则返回nil。

- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;

函数描述 :返回通过在调用方字符的两端删除给定字符集中包含的字符后而生成的新字符串(过滤字符串的方法,只针对开头和结尾)。

参数 :

set : 包含要从调用方中移除的字符的字符集。set不能为nil。

返回值 :通过在调用方字符的两端删除给定字符集中包含的字符后而生成的新字符串,如果调用方完全由set参数中的字符组成,则返回空字符串。

\color{red}{例如:去除字符串开头与结尾的特殊符号}

-(void)HandleStr{
    NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥ ¥「」"、[]{}#%-*+=_\\|~<>$€^?'@#$%^&*()_+'\""];//定义的符号集
    NSString *str = @"¥我是字符串$";
    NSString *string = [str stringByTrimmingCharactersInSet:set];//过滤字符串的方法,只针对开头和结尾
    NSLog(@"%@",string);
}

执行结果:

屏幕快照 2019-05-06 下午2.32.18.png
- (NSString *)stringByPaddingToLength:(NSUInteger)newLength withString:(NSString *)padString startingAtIndex:(NSUInteger)padIndex;

函数描述 :返回从调用方形成的新字符串,方法是从结尾根据调用方返回的新字符串的长度删除字符或者根据需要对给定的填充字符串中添加尽可能多的字符到返回的新字符串中。

参数 :

newLength : 返回的新字符串长度。

padString : 用来扩展调用方的字符串。

padIndex : padString中开始填充的索引。

返回值 : 通过从调用方删除字符或根据需要追加任意数量的padString而形成的新字符串。

\color{red}{例如 :添加字符使字符串到指定长度}

- (void)viewDidLoad {
    
    [super viewDidLoad];
    self.navigationItem.title = @"测试代码控制器";
    
    NSString *str = @"123456789";
    NSString *newStr = [str stringByPaddingToLength:12 withString:@"ABCDE" startingAtIndex:2];
    NSLog(@"%@",newStr);

}

输出如下 :

截屏2020-03-15下午8.35.08.png
- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));

函数描述在指定的字符串范围内枚举指定类型的子字符串。如果将此方法发送到NSMutableString的实例,则只要它在enclosingRange内,就允许进行改变(删除、添加或更改)。改变后,枚举继续进行,在处理范围的长度调整为改变后,枚举的范围紧跟在处理范围之后(枚举器假设长度的任何变化都发生在指定的范围内)。

例如,如果使用从位置N开始的范围调用块,并且该块删除所提供范围中的所有字符,则下一次调用也将传递N作为范围的索引。这种情况下,即使前一个范围的变异以这样的方式更改字符串,即下面的子字符串已经扩展到包括已经枚举的范围。例如,如果字符串“Hello World”通过单词枚举,并且块将“Hello ”更改为“Hello”,从而形成“HelloWorld”,则下一个枚举将返回“World”而不是“HelloWorld”。

参数 :

range : 要枚举子字符串在字符串中的范围。

opts : 指定子字符串类型和枚举样式的选项。

block : 为枚举执行的块。该块有四个参数:

  • substring : 枚举字符串。
  • substringRange : 调用方中枚举字符串的范围。
  • enclosingRange : 包括子字符串以及其后的任何分隔符或填充字符的范围。例如,对于行,enclosingRange包含行终止符。枚举的第一个字符串的enclosingRange还包含字符串之前出现的任何字符。连续的封闭范围保证不会重叠,并且枚举范围中的每个字符只包含在一个封闭范围中。
  • stop :对布尔值的引用,块可以通过设置*stop=YES来停止枚举。

注:读取方式枚举了如下属性:

typedef NS_OPTIONS(NSUInteger, NSStringEnumerationOptions) {
   
    NSStringEnumerationByLines = 0, //按行
    NSStringEnumerationByParagraphs = 1, //按段落
    NSStringEnumerationByComposedCharacterSequences = 2, //按字符顺序
    NSStringEnumerationByWords = 3,//按单词,字
    NSStringEnumerationBySentences = 4,//按句子
    NSStringEnumerationReverse = 1UL << 8,//反向遍历
    NSStringEnumerationSubstringNotRequired = 1UL << 9,//不需要子字符串
    NSStringEnumerationLocalized = 1UL << 10       //本地化

};
- (void)appendString:(NSString *)aString;

函数描述将给定字符串的字符添加到调用方的末尾。

参数 :

aString : 要附加到调用方的字符串,不能为nil。

\color{red}{例如:反转一个字符串}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *string = @"这个字符串要造反";
    NSLog(@"%@",[self reverseWordsInString:string]);
}

- (NSString*)reverseWordsInString:(NSString*)str{
    
    NSMutableString *reverString = [NSMutableString stringWithCapacity:str.length];
    //NSStringEnumerationReverse:反向遍历
    //NSStringEnumerationByComposedCharacterSequences按字符顺序
    [str enumerateSubstringsInRange:NSMakeRange(0, str.length) options:NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences  usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        
        [reverString appendString:substring];
        
    }];
    
    return reverString;
}

执行结果:

屏幕快照 2019-05-17 下午10.55.13.png
- (unichar)characterAtIndex:(NSUInteger)index;  

函数描述获取指定位置unichar 字符,unichar是两字节长的char,代表unicode的一个字符,在Objective-C中,字符串是由unichar(Unicode)字符组成。

参数 :

index : 要检索的字符的索引。如果索引位于调用方的末端之外,则引发NSRangeException。

返回值 : 由索引给定的数组位置处的字符。

\color{red}{例如:检测字符串中是否含有中文}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *string = @"ABCD我是中文啊EFG";
    if([self  checkIsChinese:string]){
        NSLog(@"含有中文");
    }else{
        NSLog(@"不含中文");
    }
}

- (BOOL)checkIsChinese:(NSString *)string{
    
    for (int i=0; i<string.length; i++){
        
        unichar ch = [string characterAtIndex:i];
        if (0x4E00 <= ch  && ch <= 0x9FA5){
            return YES;
        }
    }
    return NO;
}

执行结果:

屏幕快照 2019-05-17 下午11.08.29.png
- (NSString *)substringFromIndex:(NSUInteger)from;  

函数描述在指定索引位置截取字符串到字符串结尾。

参数 :

from : 索引。该值必须在调用方的范围内,或等于调用方的长度。如果(from-1)位于调用方的末端之外,则引发NSRangeException。

返回值 : 一个新字符串,包含从索引处到结尾的调用方字符。如果索引等于字符串的长度,则返回空字符串。

- (NSString *)substringToIndex:(NSUInteger)to; 

函数描述在字符串开头截取到指定的索引位置。

参数 :

to : 索引。该值必须在调用方的范围内,或等于调用方的长度。如果(to-1)位于调用方的末端之外,则引发NSRangeException。

返回值 : 一个新字符串,包含调用方的字符,但不包括索引处的字符。如果索引等于字符串的长度,则返回调用方的副本。

- (NSString *)substringWithRange:(NSRange)range;  

函数描述截取字符串中的某一段内容

参数 :

range : 范围。范围不能超过调用方的界限。如果(range.location-1)或(range.location+ range.length-1)位于调用方的末端之外,则引发NSRangeException。

返回值 : 一个字符串对象,包含位于给定中的调用方的字符。

\color{red}{例如:截取字符串}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *string = @"我是一个字符串";
    NSLog(@"%@",[string substringFromIndex:2]);
    NSLog(@"%@",[string substringToIndex:6]);
    NSLog(@"%@",[string substringWithRange:NSMakeRange(2, 3)]);
}

执行结果:字符串截取含头不含尾

屏幕快照 2019-05-21 下午11.10.07.png
- (BOOL)containsString:(NSString *)str ;  

函数描述 : 返回一个布尔值,通过执行区分大小写、不区语言环境的搜索,指示字符串是否包含给定字符串。(在ios7系统下会崩溃)

参数 :

str : 要搜索的字符串。这个值不能为空。

返回值 : 如果调用方包含str,则为YES,否则为NO。

- (NSRange)rangeOfString:(NSString *)searchString;

函数描述查找字符串是否包含指定字符,在ios7系统不会崩溃,功能也相对containsString复杂,可以返回字符的NSRange,可以拿到字符的位置与长度,长度小于0,则不包含该字符。

参数 :

searchString : 要搜索的字符串。

返回值 : 给出第一个searchString出现在调用方中的位置和长度的一种NSRange结构。如果searchString未找到或为空,则返回{NSNotFound,0}。

- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement;

函数描述 : 返回一个新字符串,其中指定范围内的字符将被替换为给定的字符串。

参数 :

range : 调用方中字符的范围。

replacement : 用于替换范围内字符的字符串。

\color{red}{例如 : 替换一段文本}

- (void)viewDidLoad {
    
    [super viewDidLoad];
    self.navigationItem.title = @"测试代码控制器";
    NSString *Url = @"https://www.baidu.com/index/index/home?visiter_name=HYK1909171645525&avatar=http://www.baidu.com/images/746/&domain=http://www.baidu.com";
    
    NSString *avatarUrl = @"http://www.qq.com";
    
    [self handleUrl:Url withReplaceAvatarUrl:avatarUrl];

}

- (void)handleUrl:(NSString *)Url withReplaceAvatarUrl:(NSString *)avatarUrl{
    //获取&avatar=与&domain位置
    NSRange startRange = [Url rangeOfString:@"&avatar="];
    NSRange endRange = [Url rangeOfString:@"&domain"];
    //如果&avatar=与&domain字段都是存在的
    if(startRange.length && endRange.length){
        //截取&avatar=与&domain字段中间的字符
        NSRange range = NSMakeRange(startRange.location + startRange.length, endRange.location - startRange.location - startRange.length);
        NSString *result = [Url substringWithRange:range];
        //如果截取的result不等于avatarUrl且avatarUrl有内容,进行替换
        if(![result isEqualToString:avatarUrl] && avatarUrl.length){
            //将avatarUrl替换Url中avatar字段对应的值
            NSString *newURL = [Url stringByReplacingCharactersInRange:NSMakeRange(startRange.location + startRange.length, result.length) withString:avatarUrl];
            NSLog(@"%@",newURL);
        }
    }
}

输出结果 :

截屏2020-03-12上午9.29.16.png
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;

函数描述 : 返回一个新字符串,其中调用方中所有出现的目标字符串都被另一个给定字符串替换

参数 :

target : 要替换的字符串。

replacement : 用来替换目标的字符串。

返回值 : 一个新字符串,其中调用方中所有出现的目标都被替换。

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange 

函数描述 : 返回一个新字符串,在该字符串中,调用方的指定范围内的所有目标字符串都将替换为另一个给定字符串。

参数 :

target : 要替换的字符串。

replacement : 用来替换目标的字符串。

options : 比较目标和调用方时要使用的选项的掩码。传递0以指定无选项。

searchRange : 调用方中搜索目标的范围。

返回值 : 一个新的字符串,在该字符串中,使用选项匹配的目标在调用方的搜索范围内的所有出现都被替换。

- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;

函数描述返回一个数组,该数组包含调用方中已被给定分隔符分隔的子字符串。数组中的子字符串按它们在调用方中的顺序出现。相邻出现的分隔符字符串在结果中生成空字符串。类似地,如果字符串以分隔符开头或结尾,则第一个子字符串或最后一个子字符串分别为空。

参数 :

separator : 分隔字符串。

返回值 : 一个NSArray对象,包含由分隔符分隔的来自调用方的子字符串。

\color{red}{例如:字符串转为数组}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *str = @"北京#天津#河北";
    
    NSArray *array = [str componentsSeparatedByString:@"#"];
    
    [array enumerateObjectsUsingBlock:^(NSString *str, NSUInteger idx, BOOL *stop){
        NSLog(@"%@", str);
    }];
}

执行结果:

屏幕快照 2019-05-22 下午11.56.48.png
- (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator;

函数描述返回一个数组,该数组包含调用方中已被给定集合中的字符分隔的子字符串。数组中的子字符串按照它们在调用方中的顺序出现,分隔符的相邻出现会在结果中产生空字符串。类似地,如果字符串以分隔符开始或结束,则第一个或最后一个子字符串分别为空。

参数 :

separator : 一种字符集,包含用来分割调用方的字符。不能为nil。

返回值 : 一个NSArray对象,包含来自调用方的子字符串,这些子字符串被分隔符中的字符分隔开。

- (BOOL)isEqualToString:(NSString *)aString;  

函数描述 :字符串比较,只比较字符串本身的内容是否一致。

参数 :

aString : 用来比较调用方的字符串。

返回值 : 如果aString等同于接收方(如果它们具有相同的id或者在文本比较中是NSOrderedSame),则为YES,否则为NO。

- (BOOL)hasPrefix:(NSString *)str;  

函数描述 :返回一个布尔值,该值指示给定字符串是否与调用方的开头字符匹配

参数 :

aString : 一个字符串。

返回值 : 如果aString与调用方的起始字符匹配,则返回“YES”,否则返回“NO”。如果aString为空,则返回“NO”。

- (BOOL)hasSuffix:(NSString *)str;  

函数描述 :返回一个布尔值,该值指示给定字符串是否与调用方的结尾字符匹配

参数 :

str : 一个字符串。

返回值 : 如果str与调用方的结束字符匹配,则返回“YES”,否则返回“NO”。如果str为空,则返回“NO”。

- (NSString *)commonPrefixWithString:(NSString *)str options:(NSStringCompareOptions)mask;  

函数描述返回两个字符串开头到任意一个字符不相同之间的字符,若开头都不同则返回空。

参数 :

str : 用来比较调用方的字符串。

mask : 用于比较的选项。

- (NSComparisonResult)compare:(NSString *)string;

函数描述调用方的字符串与指定的字符串进行比较。返回调用compare:options:range:的结果,其中没有传入任何选项,且以调用方的完整范围作为范围。

参数 :

string : 用来比较调用方的字符串,这个值不能为空,如果该值为空,则行为未定义。

返回值 : 返回一个NSComparisonResult值,该值指示词法排序。

- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;

函数描述调用方的字符串与指定的字符串进行比较。返回调用compare:options:range:的结果,以给定的掩码作为选项,以接收方的完整范围作为范围。

参数 :

string : 用来比较调用方的字符串,这个值不能为空,如果该值为空,则行为未定义。

mask : 搜索比较选项??梢允褂迷怂惴駽位运算符组合以下任意选项:NSCaseInsensitiveSearch、NSLiteralSearch、NSNumericSearch。

返回值 : 返回一个NSComparisonResult值,该值指示词法排序。

- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare;

函数描述调用方的字符串与指定的字符串进行比较。此方法等效于调用compare:options:range:locale:并将locale语言环境参数置nil。

参数 :

string : 用来比较调用方的字符串,这个值不能为空,如果该值为空,则行为未定义。

mask : 搜索比较选项??梢允褂迷怂惴駽位运算符组合以下任意选项:NSCaseInsensitiveSearch、NSLiteralSearch、NSNumericSearch。

rangeOfReceiverToCompare : 进行比较的调用方的范围,范围不能超过调用方的界限,如果范围超出调用方的边界,则引发NSRangeException。

返回值 : 返回一个NSComparisonResult值,该值指示词法排序。

- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare locale:(nullable id)locale;

函数描述调用方使用指定的选项与范围比较给定的字符串并返回词法排序

参数 :

string : 用于比较调用方的字符串,这个值不能为空,如果该值为空,则行为未定义。

mask : 搜索比较选项。可以使用运算符或C位运算符组合以下任意选项:NSCaseInsensitiveSearch、NSLiteralSearch、NSNumericSearch。

rangeOfReceiverToCompare : 进行比较的调用方的范围,范围不能超过调用方的界限。如果范围超出调用方的边界,则引发NSRangeException。

locale : NSLocale的一个实例,影响相等和排序的算法。要使用当前区域设置,请传递[NSLocale currentLocale]。例如如果要比较要呈现给最终用户的字符串,请使用当前区域设置,要使用系统区域设置,请传递nil。

返回值 : 返回一个NSComparisonResult值,该值指示词法排序。

  • NSComparisonResult为返回的对比结果,枚举了如下属性:
typedef NS_CLOSED_ENUM(NSInteger, NSComparisonResult) {
    //后面一个字符串大于前面一个 升序
    NSOrderedAscending = -1L, 
     // 等于
    NSOrderedSame,
    //后面一个字符串小于前面一个 降序
    NSOrderedDescending 
};
//NSStringCompareOptions为搜索选项,枚举了如下属性:
typedef NS_OPTIONS(NSUInteger, NSStringCompareOptions) {
    //不区分大小写的搜索比较。
    NSCaseInsensitiveSearch = 1,
    //一个字一个字的精确搜索比较。
    NSLiteralSearch = 2,    
    //从源字符串的结尾进行搜索比较。   
    NSBackwardsSearch = 4,
    //搜索比较仅限于源字符串的开始(或结束,如果NSBackwardsSearch)。      
    NSAnchoredSearch = 8,
    //字符串中的数字使用数值进行搜索比较,数字比较只适用于字符串中的数字,而不适用于在数字表示中具有意义的其他字符,如负号、逗号或小数点。
    NSNumericSearch = 64,
    //忽略变音符号的搜索比较,例如‘?’ 等于 ‘o’
    NSDiacriticInsensitiveSearch 
    //搜索比较会忽略具有全圆角和半圆角格式的字符的圆角差异。例如,使用此选项时,全角拉丁文小写字母“a”(U+FF41)等于基本拉丁文小写字母“a”(U+0061)。
    NSWidthInsensitiveSearch 
    //如果字符串相等但不严格相等,则强制比较返回NSOrderedAscending或NSOrderedDescending。
    NSForcedOrderingSearch 
    //搜索字符串被视为与ICU兼容的正则表达式。如果设置,则除NSCaseInsensitiveSearch和NSAnchoredSearch外,其他选项都不能应用。只能将此选项与rangeOfString:…等方法和StringByreplacingOccurrencessOfString:withString:options:range:一起使用。
    NSRegularExpressionSearch 
};

\color{red}{例如:比较两个字符串类型的版本号}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *versionNumber1 = @"5.2.0";
    NSString *versionNumber2 = @"5.3.0";
    if ([versionNumber1 compare:versionNumber2 options:NSNumericSearch] == NSOrderedDescending){
        NSLog(@"是降序,versionNumber1大于versionNumber2,要升级了");
    }else{
        NSLog(@"是升序,versionNumber1小于versionNumber2,不用升级了");
    }
}

执行结果:

屏幕快照 2019-05-22 下午10.33.32.png
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;

函数描述 :此方法相当于调用compare:options:并将NSCaseInsensitiveSearch作为唯一选项。

参数 :

string : 用来比较调用方的字符串。

返回值 : 返回一个NSComparisonResult值,该值指示词法排序。

- (NSComparisonResult)localizedCompare:(NSString *)string;

函数描述使用本地化比较来比较调用方字符串和给定字符串。此方法使用目前系统语言决定的排序方法(中文简体时可以进行多音字的排序).

参数 :

string : 用来比较调用方的字符串。此值不能为nil。如果此值为nil,则行为未定义。

返回值 : 返回一个NSComparisonResult值,该值指示词法排序。

- (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)string;

函数描述 : 使用不区分大小写的本地化比较将字符串与给定字符串进行比较

参数 :

string : 用来比较调用方的字符串。此值不能为nil,如果此值为nil,则行为未定义。

返回值 : 返回一个NSComparisonResult值,该值指示词法排序。

- (NSComparisonResult)localizedStandardCompare:(NSString *)string

函数描述本地化比较(标准),此方法在不同的区域设置下的确切排序行为是不同的。

参数 :

string : 用来比较调用方的字符串。此值不能为nil,如果此值为nil,则行为未定义。

返回值 : 返回一个NSComparisonResult值,该值指示词法排序。

\color{red}{例如:城市根据拼音首字母排序}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *stringArr = @[@"\r秦皇岛q",@"\r石家庄s", @"\r廊坊l", @"\r保定b", @"\r张家口z"];
    NSArray *result = [stringArr sortedArrayUsingSelector:@selector(localizedCompare:)];
    NSString *str = [result componentsJoinedByString:@","];
    NSLog(@"%@", str);
    
}

执行结果:

屏幕快照 2019-05-22 下午11.10.42.png
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSAttributedStringKey, id> *)attributes context:(nullable NSStringDrawingContext *)context API_AVAILABLE(macos(10.11), ios(7.0));

函数描述:在当前图形上下文中的指定矩形内,计算并返回使用给定选项和显示特征绘制的接收方的边界矩形。要正确绘制多行文本并调整其大小,请在 options 参数中传递 NSStringDrawingUsesLineFragmentOrigin。此方法返回小数大小(在返回的CGRect的size分量中),要使用返回的大小来调整视图大小,必须使用ceil函数将其值提高到最接近的较高整数。

此方法返回字符串中字形的实际边界。一些字形(例如空格)被允许与传入的size指定的布局约束重叠,因此在某些情况下,返回的CGRect的size分量的宽度值可能会超过size参数的宽度值。

参数 :

size : 限制尺寸,用于计算文本绘制时占据的矩形块。例如计算文本高度时,可以限制文本矩形的宽,并将size.heigh置为无限大MAXFLOAT。

options :文本绘制时的附加选项。

attributes : 要应用于字符串的文本属性字典。这些是可以应用于 NSAttributedString 对象的相同属性,但在 NSString 对象的情况下,这些属性应用于整个字符串,而不是字符串中的范围。

context : 用于调用方的字符串绘图上下文,可以指定最小比例因子和跟踪调整。

返回值 :使用给定选项和显示特征绘制的调用方的边界矩形。从这个方法返回的矩形原点是第一个字形原点。

\color{red}{例如:计算文本高度}

@interface ViewController ()

@property(nonatomic, strong)UIView *redView;
@property(nonatomic, strong)UIView *greenView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectZero];
    label.numberOfLines = 0;
    label.textColor = [UIColor redColor];
    label.textAlignment = NSTextAlignmentCenter;
    label.font = [UIFont systemFontOfSize:20];
    label.text = @"一生一世一首词,一心一意一首诗,此生唯愿与君和,喃喃低语话相思。";
    [self.view addSubview:label];
    
    /**
     size:限制尺寸,用于计算文本绘制时占据的矩形块,可以将size.heigh置为无限大MAXFLOAT
     option:文本绘制时的附加选项,枚举了如下值
     typedef NS_OPTIONS(NSInteger, NSStringDrawingOptions) {
     NSStringDrawingUsesLineFragmentOrigin = 1 << 0, // 整个文本将以每行组成的矩形为单位计算整个文本的尺寸。
     NSStringDrawingUsesFontLeading = 1 << 1, // 使用字体的行间距来计算文本占用的范围,即每一行的底部到下一行的底部的距离计算
     NSStringDrawingUsesDeviceMetrics = 1 << 3, // 将文字以图像符号计算文本占用范围,而不是以字符计算。也即是以每一个字体所占用的空间来计算文本范围
     NSStringDrawingTruncatesLastVisibleLine NS_ENUM_AVAILABLE(10_5, 6_0) = 1 << 5, // 如果文本不符合指定的边界,则截断并将省略号字符添加到最后一行。如果未同时设置NSStringDrawingUsesLineFragmentOrigin,则忽略此项。
     
     }
     */
    
    CGSize size = CGSizeMake (180, CGFLOAT_MAX);
    CGRect rect = [label.text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:20]} context:nil];
    CGFloat labelHeight = rect.size.height;
    NSLog(@"%f",ceil(labelHeight));
    
    [label mas_makeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        make.width.mas_equalTo(180);
        make.height.mas_equalTo(ceil(labelHeight));
    }];

}

@end

打印结果:(注:如果字符串的包含 \r 会影响高度的计算)

屏幕快照 2019-07-20 下午4.13.48.png

显示结果:

屏幕快照 2019-07-20 下午4.12.09.png
最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容