NSString声明了一系列不可变字符串的接口,当通过NSString创建一个字符串时,就代表这个字符串对象是不可变的。当你想使用可变字符串时,可以使用NSMutableString。
NSString实现了两个通用的方法length和characterAtIndex:。length可以获得字符串的长度;characterAtIndex:可以通过索引获得字符串中指定位置的字符,其索引的起始位置是0。
NSString还声明查找和比较字符串的接口,而且还声明了NSString转数值类型、组合字符串的接口。
关于NSMutableString的编程介绍详见《NSMutableString Class Reference》
初始化字符串
+ string
- init
- initWithBytes:length:encoding:
- initWithBytesNoCopy:length:encoding:freeWhenDone:
- initWithCharacters:length:
- initWithCharactersNoCopy:length:freeWhenDone:
- initWithString:
- initWithCString:encoding:
- initWithUTF8String:
- initWithFormat:
- initWithFormat:arguments:
- initWithFormat:locale:
- initWithFormat:locale:arguments:
- initWithData:encoding:
+ stringWithFormat:
+ localizedStringWithFormat:
+ stringWithCharacters:length:
+ stringWithString:
+ stringWithCString:encoding:
+ stringWithUTF8String:
#pragma mark - 初始化字符串
- (void)testCreatingAndInitializingStrings {
// 空字符串
NSString *string = [NSString string];
string = [[NSString alloc] init];
string = @"";
// 通过字符串生成字符串
string = [NSString stringWithString:string];
string = [[NSString alloc] initWithString:string];
string = string;
// 通过char生成NSString
string = [NSString stringWithUTF8String:"阳君"];
string = [[NSString alloc] initWithUTF8String:"阳君"];
// 组合生成NSString
string = [NSString stringWithFormat:@"%@", @"阳君"];
string = [[NSString alloc] initWithFormat:@"%@", @"阳君"];
// 通过utf-8字符串
string = [NSString stringWithUTF8String:string.UTF8String];
string = [[NSString alloc] initWithUTF8String:string.UTF8String];
// 通过C字符串
const char *cStr = [string cStringUsingEncoding:NSUTF8StringEncoding];
string = [NSString stringWithCString:cStr encoding:NSUTF8StringEncoding];
string = [[NSString alloc] initWithCString:cStr encoding:NSUTF8StringEncoding];
}
通过NSString路径读取文件内容
+ stringWithContentsOfFile:encoding:error:
- initWithContentsOfFile:encoding:error:
+ stringWithContentsOfFile:usedEncoding:error:
- initWithContentsOfFile:usedEncoding:error:
#pragma mark 测试数据
- (NSString *)testData {
// 获取应用中Document文件夹
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:];
// 测试数据
NSString *string = @"阳君;937447974";
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"test.plist"];
NSError *error;
[string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"错误:%@", error.localizedDescription);
}
return filePath;
}
#pragma mark - 通过NSString路径读取文件内容
- (void)testCreatingAndInitializingFromFile {
NSString *filePath = [self testData];
NSError *error;
// 指定编码格式读取
NSString *string = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
string = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
// 自动打开,并返回解析的编码模式
NSStringEncoding enc;
string = [NSString stringWithContentsOfFile:filePath usedEncoding:&enc error:&error];
string = [[NSString alloc] initWithContentsOfFile:filePath usedEncoding:&enc error:&error];
if (error) {
NSLog(@"错误:%@", error.localizedDescription);
}
}
通过NSURL路径读取文件内容
+ stringWithContentsOfURL:encoding:error:
- initWithContentsOfURL:encoding:error:
+ stringWithContentsOfURL:usedEncoding:error:
- initWithContentsOfURL:usedEncoding:error:
#pragma mark 通过NSURL路径读取文件内容
- (void)testCreatingAndInitializingFromURL {
NSString *filePath = [self testData];
NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
NSError *error;
// 指定编码格式读取
NSString *string = [NSString stringWithContentsOfURL:fileUrl encoding:NSUTF8StringEncoding error:&error];
string = [[NSString alloc] initWithContentsOfURL:fileUrl encoding:NSUTF8StringEncoding error:&error];
// 自动打开,并返回解析的编码模式
NSStringEncoding enc;
string = [NSString stringWithContentsOfURL:fileUrl usedEncoding:&enc error:&error];
string = [[NSString alloc] initWithContentsOfURL:fileUrl usedEncoding:&enc error:&error];
if (error) {
NSLog(@"错误:%@", error.localizedDescription);
}
}
通过NSString或NSURL路径写入NSString
- writeToFile:atomically:encoding:error:
- writeToURL:atomically:encoding:error:
#pragma mark 通过NSString或NSURL路径写入NSString
- (void)testWritingFileOrURL {
NSString *filePath = [self testData];
NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
NSError *error;
NSString *string = @"阳君;937447974";
// 指定编码格式写入
BOOL write = [string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
write = [string writeToURL:fileUrl atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"错误:%@", error.localizedDescription);
}
}
获取字符串长度
length Property
- lengthOfBytesUsingEncoding:
- maximumLengthOfBytesUsingEncoding:
#pragma mark - 获取字符串长度
- (void)testGettingLength {
NSString *string = @"阳君;937447974";
// 长度
NSInteger length = string.length;
// 指定编码格式后的长度
length = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
// 返回存储时需要指定的长度
length = [string maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding];
}
获取Characters和Bytes
- characterAtIndex:
- getCharacters:range:
- getBytes:maxLength:usedLength:encoding:options:range:remainingRange:
#pragma mark 获取Characters和Bytes
- (void)testGettingCharactersAndBytes {
NSString *string = @"YangJun;937447974";
// 提取指定位置的character
unichar uch = [string characterAtIndex];
// 提取Bytes,并返回使用的长度
NSUInteger length = [string maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding];
const void *bytes;
NSRange range = ,};
BOOL gByte = [string getBytes:&bytes maxLength:length usedLength:&length encoding:NSUTF8StringEncoding options:NSStringEncodingConversionAllowLossy range:range remainingRange:nil];
NSLog(@"%d", gByte);
// 有问题
[string getCharacters:&uch range:range];
}
获取C字符串
- cStringUsingEncoding:
- getCString:maxLength:encoding:
UTF8String Property
#pragma mark 获取C字符串
- (void)testGettingCStrings {
NSString *string = @"阳君;937447974";
// 指定编码格式,获取C字符串
const char *c = [string cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%s", c);
// 获取通过UTF-8转码的字符串
const char *UTF8String = [string UTF8String];
NSLog(@"%s", UTF8String);
/** 有线程问题
char *cString;
NSUInteger length = [string maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding];
BOOL bGet = [string getCString:cString maxLength:length encoding:NSUTF8StringEncoding];
NSLog(@"%d, %s", bGet, cString);
*/
}
增加字符串
- stringByAppendingFormat:
- stringByAppendingString:
- stringByPaddingToLength:withString:startingAtIndex:
#pragma mark - 增加字符串
- (void)testCombiningStrings {
NSString *string = @"阳君;937447974";
// string后增加字符串并生成一个新的字符串
string = [string stringByAppendingString:@";IOS"];
// string后增加组合字符串并生成一个新的字符串
string = [string stringByAppendingFormat:@";%@", @"OC"];
// string后增加循环字符串,stringByPaddingToLength:完毕后截取的长度;startingAtIndex:从增加的字符串第几位开始循环增加。
string = [string stringByPaddingToLength: withString:@";Swift" startingAtIndex:];
}
分割字符串
- componentsSeparatedByString:
- componentsSeparatedByCharactersInSet:
- stringByTrimmingCharactersInSet:
- substringFromIndex:
- substringWithRange:
- substringToIndex:
#pragma mark 分割字符串
- (void)testDividingStrings {
NSString *string = @"阳君;Yj937447974";
// 根据指定的字符串分割成数组
NSArray<NSString *> *array = [string componentsSeparatedByString:@";"];
// 通过系统自带的分割方式分割字符串
NSCharacterSet *set = [NSCharacterSet lowercaseLetterCharacterSet];
array = [string componentsSeparatedByCharactersInSet:set];
// 没啥用
string = [string stringByTrimmingCharactersInSet:set];
// 返回指定位置后的字符串
string = @"阳君;937447974";
string = [string substringFromIndex:];
// 返回指定范围的字符串
string = @"阳君;937447974";
NSRange range = {, };
string = [string substringWithRange:range];
// 返回指定位置钱的字符串
string = @"阳君;937447974";
string = [string substringToIndex:];
}
查找字符串
- rangeOfCharacterFromSet:
- rangeOfCharacterFromSet:options:
- rangeOfCharacterFromSet:options:range:
- rangeOfString:
- rangeOfString:options:
- rangeOfString:options:range:
- rangeOfString:options:range:locale:
- enumerateLinesUsingBlock:
- enumerateSubstringsInRange:options:usingBlock:
#pragma mark - 查找字符串
- (void)testFindingCharactersAndSubstrings {
NSString *string = @"阳君;937447974";
NSRange searchRange = , string.length};
NSCharacterSet *set = [NSCharacterSet uppercaseLetterCharacterSet];
// 根据NSCharacterSet查找
NSRange range = [string rangeOfCharacterFromSet:set];
// 根据NSCharacterSet查找,并选择查找模式
range = [string rangeOfCharacterFromSet:set options:NSCaseInsensitiveSearch];
// 根据NSCharacterSet查找,并选择查找模式,以及范围
range = [string rangeOfCharacterFromSet:set options:NSCaseInsensitiveSearch range:searchRange];
// 根据字符串查找
range = [string rangeOfString:@"93"];
range = [string rangeOfString:@"93" options:NSCaseInsensitiveSearch];
range = [string rangeOfString:@"93" options:NSCaseInsensitiveSearch range:searchRange];
range = [string rangeOfString:@"93" options:NSCaseInsensitiveSearch range:searchRange locale:nil];
// block 查找
[string enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) {
NSLog(@"%@", line);
if ([@"93" isEqualToString:line]) {
NSLog(@"search");
*stop = YES;
}
}];
// block查找,可设置查找方式,并得到找到的位置
[string enumerateSubstringsInRange:searchRange options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
NSLog(@"%@", substring);
if ([@"9" isEqualToString:substring]) {
NSLog(@"location:%d; length:%d", substringRange.location, substringRange.length);
NSLog(@"location:%d; length:%d", enclosingRange.location, enclosingRange.length);
*stop = YES;
}
}];
}
替换字符串
- stringByReplacingOccurrencesOfString:withString:
- stringByReplacingOccurrencesOfString:withString:options:range:
- stringByReplacingCharactersInRange:withString:
#pragma mark 替换字符串
- (void)testReplacingSubstrings {
NSString *string = @"阳君;937447974";
NSRange searchRange = {, string.length};
// 全局替换
string = [string stringByReplacingOccurrencesOfString:@";" withString:@";;"];
// 设置替换的模式,并设置范围
string = [string stringByReplacingOccurrencesOfString:@";" withString:@"-" options:NSCaseInsensitiveSearch range:searchRange];
// 将指定范围的字符串替换为指定的字符串
string = [string stringByReplacingCharactersInRange:searchRange withString:@"1"];
}
识别和比较字符串
- caseInsensitiveCompare:
- localizedCaseInsensitiveCompare:
- compare:
- localizedCompare:
- compare:options:
- compare:options:range:
- compare:options:range:locale:
- localizedStandardCompare:
- hasPrefix:
- hasSuffix:
- isEqualToString:
hash Property
#pragma mark - 识别和比较字符串
- (void)testIdentifyingAndComparingStrings {
NSString *string = @"阳君;937447974";
NSString *compareStr = @"阳君;837447974";
NSRange searchRange = {, string.length};
// 比较大小
NSComparisonResult result = [string compare:compareStr];
// 前缀比较
BOOL isHas = [string hasPrefix:@"阳君"];
// 后缀比较
isHas = [string hasSuffix:@"4"];
// 全比较是否相同
isHas = [string isEqualToString:compareStr];
// 通过指定的比较模式,比较字符串
result = [string compare:compareStr options:NSCaseInsensitiveSearch];
// 等价
result = [string caseInsensitiveCompare:compareStr];
// 添加比较范围
result = [string compare:compareStr options:NSCaseInsensitiveSearch range:searchRange];
// 增加比较地域
result = [string compare:compareStr options:NSCaseInsensitiveSearch range:searchRange locale:nil];
// 本地化字符串,再比较
result = [string localizedCompare:compareStr];
result = [string localizedStandardCompare:compareStr];
// NSCaseInsensitiveSearch模式
result = [string localizedCaseInsensitiveCompare:compareStr];
// hash值
NSUInteger hash = string.hash;
NSLog(@"hash:%lu", (unsigned long)hash);
}
字符串折叠
- stringByFoldingWithOptions:locale:
#pragma mark 字符串折叠
- (void)testFoldingStrings {
NSString *string = @"阳君;937447974";
// 前缀检验,如果相同,就返回前缀
string = [string commonPrefixWithString:@"君;" options:NSCaseInsensitiveSearch];
}
获得共享的前缀
- commonPrefixWithString:options:
#pragma mark 获得共享的前缀
- (void)testGettingSharedPrefix {
NSString *string = @"阳君;937447974";
NSString *compareStr = @"阳君;837447974";
// 返回两个字符串相同的前缀
string = [string commonPrefixWithString:compareStr options:NSCaseInsensitiveSearch];
}
大小写变化
capitalizedString Property
- capitalizedStringWithLocale:
lowercaseString Property
- lowercaseStringWithLocale:
uppercaseString Property
- uppercaseStringWithLocale:
#pragma mark - 大小写变化
- (void)testChangingCase {
NSString *string = @"阳君;y937447974J";
NSLocale *locale = [NSLocale currentLocale];
// 全变大写
NSString *result = string.capitalizedString;
// 指定系统环境变化
result = [string capitalizedStringWithLocale:locale];
// 全变大写
result = string.uppercaseString;
result = [string uppercaseStringWithLocale:locale];
// 全变小写
result = string.lowercaseString;
result = [string lowercaseStringWithLocale:locale];
}
转数值
doubleValue Property
floatValue Property
intValue Property
integerValue Property
longLongValue Property
boolValue Property
#pragma mark 得到数值
- (void)testGettingNumericValues {
NSString *string = @"123";
NSLog(@"doubleValue:%f", string.doubleValue);
NSLog(@"floatValue:%f", string.floatValue);
NSLog(@"intValue:%d", string.intValue);
NSLog(@"integerValue:%d", string.integerValue);
NSLog(@"longLongValue:%lld", string.longLongValue);
NSLog(@"boolValue:%hhd", string.boolValue);
}
使用路径
+ pathWithComponents:
pathComponents Property
- completePathIntoString:caseSensitive:matchesIntoArray:filterTypes:
fileSystemRepresentation Property
- getFileSystemRepresentation:maxLength:
absolutePath Property
lastPathComponent Property
pathExtension Property
stringByAbbreviatingWithTildeInPath Property
- stringByAppendingPathComponent:
- stringByAppendingPathExtension:
stringByDeletingLastPathComponent Property
stringByDeletingPathExtension Property
stringByExpandingTildeInPath Property
stringByResolvingSymlinksInPath Property
stringByStandardizingPath Property
- stringsByAppendingPaths:
#pragma mark - 使用路径
- (void)testWorkingWithPaths {
// 获取应用中Document文件夹
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:];
// 路径拆分为数组中的元素
NSArray<NSString *> *pathComponents = documentsDirectory.pathComponents;
// 将数组中的元素拼接为路径
documentsDirectory = [NSString pathWithComponents:pathComponents];
// 加载测试数据
NSString *string = @"阳君;937447974";
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"test.plist"];
[string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
filePath = [documentsDirectory stringByAppendingPathComponent:@"test1.plist"];
[string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
// 寻找文件夹下包含指定扩展名的文件路径
NSString *outputName;// 相同的前缀
NSArray *filterTypes = [NSArray arrayWithObjects:@"txt", @"plist", nil];
NSUInteger matches = [documentsDirectory completePathIntoString:&outputName caseSensitive:YES matchesIntoArray:&pathComponents filterTypes:filterTypes];
NSLog(@"找到:%d", matches);
// 添加路径
filePath = [documentsDirectory stringByAppendingPathComponent:@"test"];
// 添加扩展名
filePath = [filePath stringByAppendingPathExtension:@"plist"];
// 是否绝对路径
NSLog(@"absolutePath:%d", filePath.absolutePath);
// 最后一个路径名
NSLog(@"lastPathComponent:%@", filePath.lastPathComponent);
// 扩展名
NSLog(@"pathExtension:%@", filePath.pathExtension);
// 去掉扩展名
string = filePath.stringByDeletingPathExtension;
// 去掉最后一个路径
string = filePath.stringByDeletingLastPathComponent;
// 批量增加路径,并返回生成的路径
pathComponents = [filePath stringsByAppendingPaths:pathComponents];
// 没啥用
string = filePath.stringByExpandingTildeInPath;
string = filePath.stringByResolvingSymlinksInPath;
string = filePath.stringByStandardizingPath;
}
使用URL
- stringByAddingPercentEncodingWithAllowedCharacters:
- stringByRemovingPercentEncoding
#pragma mark 使用URL
- (void)testWorkingWithURLs {
NSString *path = @"阳君/937447974";
NSCharacterSet *set = [NSCharacterSet controlCharacterSet];
// 转%格式码
NSString *string = [path stringByAddingPercentEncodingWithAllowedCharacters:set];
// 转可见
string = string.stringByRemovingPercentEncoding;
}
其他
参考资料
String Programming Guide
NSString Class Reference
文档修改记录
时间 | 描述 |
---|---|
2015-10-21 | 根据IOS9的NSString API总结 |
版权所有:http://blog.csdn.net/y550918116j