NSString
NSString派生自NSObject,一个静态的纯文本Unicode字符串对象。NSString类及其可变子类NSMutableString为处理字符串提供了一组广泛的api,包括用于比较、搜索和修改字符串的方法。NSString对象用于整个Foundation和其他Cocoa框架,作为平台上所有文本和语言功能的基础。
NSString的常用属性
@property (readonly) NSUInteger length;
属性描述 : 接收器中的UTF-16编码单元的数量。此数字包括组合字符序列的单个字符,因此不能使用此属性确定字符串在打印时是否可见或显示多长时间。
@property (readonly) NSUInteger length;
@property (readonly) double doubleValue;
属性描述 : 字符串的浮点值为双精度浮点数。此属性在字符串开头不包含任何空格。此属性为SURGE U VAL或–SURGE U VAL(溢出时),0.0(下溢时)。如果字符串没有以浮点数的有效文本表示形式开始,则此属性为0.0。此属性使用存储在非本地化值中的格式信息;使用NSScanner对象对字符串中的数值进行本地化扫描。
@property (readonly) double doubleValue;
@property (readonly) float floatValue;
属性描述 : 字符串的浮点值作为浮点数。此属性不包括字符串开头的空格。此属性为SURGE U VAL或–SURGE U VAL(溢出时),0.0(下溢时)。如果字符串不是以有效的浮点数文本表示形式开头,则此属性为0.0。此方法使用存储在非本地化值中的格式化信息;使用NSScanner对象对字符串中的数值进行本地化扫描。
@property (readonly) float floatValue;
@property (readonly) int intValue;
属性描述 : 字符串的整数值。字符串的整数值,采用十进制表示,并跳过字符串开头的空格。溢出时此属性为INT_MAX或INT_MIN。如果字符串不是以数字的有效十进制文本表示形式开头,则此属性为0。此属性使用存储在非本地化值中的格式信息;使用NSScanner对象对字符串中的数值进行本地化扫描。
@property (readonly) int intValue;
@property (readonly, copy) NSString *uppercaseString;
属性描述 : 字符串的大写表示。此属性执行规范(非本地化)映射。它适用于不依赖于当前区域设置而需要稳定结果的编程操作。大小写转换不能保证是对称的,也不能保证生成与原始字符串长度相同的字符串。当处理呈现给用户的文本时,使用localizedUppercaseString或uppercaseStringWithLocale:代替。
@property (readonly, copy) NSString *uppercaseString;
@property (readonly, copy) NSString *lowercaseString;
属性描述 : 字符串的小写表示。此属性执行规范(非本地化)映射。它适用于需要不依赖于当前语言环境的稳定结果的编程操作。不能保证大小写转换是对称的,也不能保证生成与原始字符串相同长度的字符串。当处理呈现给用户的文本时,使用localizedLowercaseString或lowercaseStringWithLocale:代替。
@property (readonly, copy) NSString *lowercaseString;
@property (readonly, copy) NSString *capitalizedString;
属性描述 : 字符串的首字母变大写表示形式。每个单词中的第一个字符更改为其对应的大写值,其余所有字符设置为其对应的小写值。单词是由空格、制表符或行结束符分隔的任何字符序列(列在getLineStart:end:contentsEnd:forRange:下)。不考虑某些常用的分隔词标点,因此此属性通常不会为多字字符串生成所需的结果。不能保证大小写转换是对称的,也不能保证生成与原始字符串相同长度的字符串。此属性执行规范(非本地化)映射。它适用于需要不依赖于当前语言环境的稳定结果的编程操作。当处理呈现给用户的文本时,使用localizedCapitalizedString或capitalizedStringWithLocale:代替。
@property (readonly, copy) NSString *capitalizedString;
@property (readonly) NSUInteger hash;
属性描述 : 可以用作哈希表地址的无符号整数。如果两个字符串对象相等(由isEqualToString:方法确定),则它们必须具有相同的哈希值。此属性满足此要求。(经典的话一定要会说:两个相等的实例,他们的hash值一定相等。但是hash值相等的两个实例,不一定相等。)
@property (readonly) NSUInteger hash;
NSString的常用函数
- (instancetype)initWithString:(NSString *)aString;
函数描述 : 通过复制另一个给定字符串中的字符来初始化NSString对象。
参数 :
aString : 要从中复制字符的字符串。这个值不能为nil。如果aString为nil,则引发一个NSInvalidArgumentException。
返回值 : 通过复制aString中的字符来初始化的NSString对象。返回的对象可能与原始接收器不同。
- (instancetype)initWithString:(NSString *)aString;
- (instancetype)initWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
函数描述 : 返回一个初始化的NSString对象,该对象使用一个给定的格式字符串作为模板,其余的参数值被替换到该模板中。此方法调用initWithFormat:locale:arguments:而不应用任何本地化。
参数 :
format : 一个格式字符串。这个值不能为nil,如果格式为nil,则引发一个NSInvalidArgumentException。
返回值 : 使用format作为模板初始化的NSString对象,其余的参数值将根据系统区域设置替换到该模板中。返回的对象可能与原始接收器不同。
- (instancetype)initWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
- (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信息替换为该模板中的值。返回的对象可能与原始器收方不同。
- (instancetype)initWithFormat:(NSString *)format locale:(nullable id)locale arguments:(va_list)argList NS_FORMAT_FUNCTION(1,0);
- (nullable instancetype)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;
函数描述 : 返回通过使用给定编码将给定数据转换为UTF-16代码单元而初始化的NSString对象。
参数 :
data : 包含字节编码和默认纯文本格式(即没有属性或其他标记的纯内容)的NSData对象。
encoding : 数据使用的编码。
返回值 : 通过使用编码将数据中的字节转换为UTF-16代码单元而初始化的NSString对象。返回的对象可能与原始接收器不同。如果初始化由于某种原因失败(例如,如果数据不表示要编码的有效数据),则返回nil。
- (nullable instancetype)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;
- (nullable instancetype)initWithBytes:(const void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding;
函数描述 : 返回一个初始化的NSString对象,该对象包含一个给定字节数,该字节数来自一个以给定编码方式解释的给定字节缓冲区。
参数 :
bytes : 在编码指定的编码中解释的字节缓冲区。
length : 从字节使用的字节数。
encoding : 应用于字节的字符编码。
返回值 : 一个初始化的NSString对象,包含长度字节,这些字节来自使用编码编码解释的字节。返回的对象可能与原始接收器不同。如果字节字符串的长度大于指定长度,则返回nil。
- (nullable instancetype)initWithBytes:(const void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding;
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
函数描述 : 返回通过从给定字符集中包含的接收器字符的两端删除而生成的新字符串。(过滤字符串的方法,只针对开头和结尾)
参数 :
set : 包含要从接收器中移除的字符的字符集。set不能为nil。
返回值 :通过从集合中包含的接收器字符的两端删除而生成的新字符串。如果接收器完全由set中的字符组成,则返回空字符串。
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
例如:去除字符串开头与结尾的特殊符号
-(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而形成的新字符串。
- (NSString *)stringByPaddingToLength:(NSUInteger)newLength withString:(NSString *)padString startingAtIndex:(NSUInteger)padIndex;
例如 :
- (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来停止枚举。
- (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));
注:读取方式枚举了如下属性:
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
- (void)appendString:(NSString *)aString;
例如:反转一个字符串
- (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的一个字符,OC中,字符串是由unichar(Unicode)字符组成。
参数 :
index : 要检索的字符的索引。如果索引位于接收器的末端之外,则引发NSRangeException。
返回值 : 由索引给定的数组位置处的字符。
- (unichar)characterAtIndex:(NSUInteger)index;
例如:检测字符串中是否含有中文
- (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 *)substringFromIndex:(NSUInteger)from;
- (NSString *)substringToIndex:(NSUInteger)to;
函数描述 : 在字符串开头截取到指定的索引位置。
参数 :
to : 索引。该值必须在接收器的范围内,或等于接收器的长度。如果(to-1)位于接收器的末端之外,则引发NSRangeException。
返回值 : 一个新字符串,包含接收器的字符,但不包括索引处的字符。如果索引等于字符串的长度,则返回接收器的副本。
- (NSString *)substringToIndex:(NSUInteger)to;
- (NSString *)substringWithRange:(NSRange)range;
函数描述 : 截取字符串中的某一段内容。
参数 :
range : 范围。范围不能超过接收器的界限。如果(range.location-1)或(range.location+ range.length-1)位于接收器的末端之外,则引发NSRangeException。
返回值 : 一个字符串对象,包含位于给定中的接收器的字符。
- (NSString *)substringWithRange:(NSRange)range;
例如:
- (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。
- (BOOL)containsString:(NSString *)str ;
查找字符串是否包含指定字符(在ios7系统不会崩溃,功能也相对containsString复杂,可以返回字符的NSRange,可以拿到字符的位置与长度,长度小于0,则不包含该字符):
- (NSRange)rangeOfString:(NSString *)searchString;
函数描述 : 查找并返回字符串中给定字符串第一次出现的范围。
参数 :
searchString : 要搜索的字符串。
返回值 : 给出第一个searchString出现在接收器中的位置和长度的一种NSRange结构。如果searchString未找到或为空,则返回{NSNotFound,0}。
- (NSRange)rangeOfString:(NSString *)searchString;
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement;
函数描述 : 返回一个新字符串,其中指定范围内的字符将被替换为给定的字符串。
参数 :
range : 接收器中字符的范围。
replacement : 用于替换范围内字符的字符串。
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement;
例如 : 替换一段文本
- (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;
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange ;
函数描述 : 返回一个新字符串,在该字符串中,接收器的指定范围内的所有目标字符串都将替换为另一个给定字符串。
参数 :
target : 要替换的字符串。
replacement : 用来替换目标的字符串。
options : 比较目标和接收器时要使用的选项的掩码。传递0以指定无选项。
searchRange : 接收器中搜索目标的范围。
返回值 : 一个新的字符串,在该字符串中,使用选项匹配的目标在接收器的搜索范围内的所有出现都被替换。
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
函数描述 : 返回一个数组,该数组包含接收器中已被给定分隔符分隔的子字符串。数组中的子字符串按它们在接收器中的顺序出现。相邻出现的分隔符字符串在结果中生成空字符串。类似地,如果字符串以分隔符开头或结尾,则第一个子字符串或最后一个子字符串分别为空。
参数 :
separator : 分隔字符串。
返回值 : 一个NSArray对象,包含由分隔符分隔的来自接收器的子字符串。
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
例如:字符串转为数组
- (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对象,包含来自接收器的子字符串,这些子字符串被分隔符中的字符分隔开。
- (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator;
- (BOOL)isEqualToString:(NSString *)aString;
函数描述 : 字符串比较,只比较字符串本身的内容是否一致。
参数 :
aString : 用来比较接收器的字符串。
返回值 : 如果aString等同于接收方(如果它们具有相同的id或者在文本比较中是NSOrderedSame),则为YES,否则为NO。
- (BOOL)isEqualToString:(NSString *)aString;
- (BOOL)hasPrefix:(NSString *)str;
函数描述 : 返回一个布尔值,该值指示给定字符串是否与接收器的开头字符匹配。
参数 :
aString : 一个字符串。
返回值 : 如果aString与接收器的起始字符匹配,则返回“YES”,否则返回“NO”。如果aString为空,则返回“NO”。
- (BOOL)hasPrefix:(NSString *)str;
字符串内容是否以某个字符结尾:
- (BOOL)hasSuffix:(NSString *)str;
函数描述 : 返回一个布尔值,该值指示给定字符串是否与接收器的结尾字符匹配。
参数 :
str : 一个字符串。
返回值 : 如果str与接收器的结束字符匹配,则返回“YES”,否则返回“NO”。如果str为空,则返回“NO”。
- (BOOL)hasSuffix:(NSString *)str;
- (NSString *)commonPrefixWithString:(NSString *)str options:(NSStringCompareOptions)mask;
函数描述 : 返回两个字符串开头到任意一个字符不相同之间的字符,若开头都不同则返回空。
参数 :
str : 用来比较接收器的字符串。
mask : 用于比较的选项。
- (NSString *)commonPrefixWithString:(NSString *)str options:(NSStringCompareOptions)mask;
- (NSComparisonResult)compare:(NSString *)string;
函数描述 : 接收器的字符串与指定的字符串进行比较。返回调用compare:options:range:的结果,其中没有传入任何选项,并且以接收器的完整范围作为范围。
参数 :
string : 用来比较接收器的字符串。这个值不能为空。如果该值为空,则行为未定义。
返回值 : 返回一个NSComparisonResult值,该值指示词法排序。
- (NSComparisonResult)compare:(NSString *)string;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
函数描述 : 接收器的字符串与指定的字符串进行比较。返回调用compare:options:range:的结果,以给定的掩码作为选项,以接收方的完整范围作为范围。
参数 :
string : 用来比较接收器的字符串。这个值不能为空。如果该值为空,则行为未定义。
mask : 搜索比较选项。可以使用运算符或C位运算符组合以下任意选项:NSCaseInsensitiveSearch、NSLiteralSearch、NSNumericSearch。
返回值 : 返回一个NSComparisonResult值,该值指示词法排序。
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare;
函数描述 : 接收器的字符串与指定的字符串进行比较。此方法等效于调用compare:options:range:locale:并将locale语言环境参数置nil。
参数 :
string : 用来比较接收器的字符串。这个值不能为空。如果该值为空,则行为未定义。
mask : 搜索比较选项。可以使用运算符或C位运算符组合以下任意选项:NSCaseInsensitiveSearch、NSLiteralSearch、NSNumericSearch。
rangeOfReceiverToCompare : 进行比较的接收器的范围。范围不能超过接收器的界限。如果范围超出接收器的边界,则引发NSRangeException。
返回值 : 返回一个NSComparisonResult值,该值指示词法排序。
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare;
- (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)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare locale:(nullable id)locale;
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
};
例如:比较两个字符串类型的版本号
- (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)caseInsensitiveCompare:(NSString *)string;
- (NSComparisonResult)localizedCompare:(NSString *)string;
函数描述 : 使用本地化比较来比较字符串和给定字符串。此方法使用目前系统语言决定的排序方法(中文简体时可以进行多音字的排序).
参数 :
string : 用来比较接收器的字符串。此值不能为零。如果此值为零,则行为未定义。
返回值 : 返回一个NSComparisonResult值,该值指示词法排序。
- (NSComparisonResult)localizedCompare:(NSString *)string;
本地化比较(不区分大小写):
- (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)string;
函数描述 : 使用不区分大小写的本地化比较将字符串与给定字符串进行比较。
参数 :
string : 用来比较接收器的字符串。此值不能为零。如果此值为零,则行为未定义。
返回值 : 返回一个NSComparisonResult值,该值指示词法排序。
- (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)string;
- (NSComparisonResult)localizedStandardCompare:(NSString *)string;
函数描述 : 本地化比较(标准),此方法在不同的区域设置下的确切排序行为是不同的。
参数 :
string : 用来比较接收器的字符串。此值不能为零。如果此值为零,则行为未定义。
返回值 : 返回一个NSComparisonResult值,该值指示词法排序。
- (NSComparisonResult)localizedStandardCompare:(NSString *)string
例如:城市根据拼音首字母排序
- (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 NS_AVAILABLE(10_11, 7_0);
例如:
@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
打印结果:
屏幕快照 2019-07-20 下午4.13.48.png 屏幕快照 2019-07-20 下午4.12.09.png
注:如果字符串的包含 \r 会影响高度的计算。
也可以通过UILabel的sizeThatFits函数计算文本的高度,例如:
- (void)viewDidLoad {
[super viewDidLoad];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectZero];
label.numberOfLines = 0;
label.textColor = [UIColor redColor];
label.textAlignment = NSTextAlignmentCenter;
label.font = [UIFont systemFontOfSize:18];
label.text = @"满100元,减2元、包邮、送5积分、送红包、送赠品;";
[self.view addSubview:label];
CGSize size = [self adoptLabelCalculationTextHeight:label.text andFont:[UIFont systemFontOfSize:18] andTextWidth:50];
CGFloat labelHeight = size.height;
NSLog(@"%f",ceil(labelHeight));
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.width.mas_equalTo(50);
make.height.mas_equalTo(ceil(labelHeight));
}];
}
- (CGSize)adoptLabelCalculationTextHeight:(NSString *)text andFont:(UIFont *)font andTextWidth:(CGFloat)textWidth{
UILabel *label = [[UILabel alloc]init];
label.numberOfLines = 0;
label.text = text;
label.font = font;
CGSize labelSize = [label sizeThatFits:CGSizeMake(textWidth, MAXFLOAT)];
return labelSize;
}
打印结果:
屏幕快照 2019-08-23 下午10.50.54.png
屏幕快照 2019-08-23 下午10.53.07.png
网友评论