本篇文章介绍OC的字符串
要使用Objective-C语言创建一个常量字符串对象,需要在字符串开头放置 一个@字符,下面的语句创建了一个常量字符串
@"Programoning is fun"
NSLog函数可以打印格式化对象,类似于C语言的printf
看下面的例子:
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString* a = @"this is a string.";
NSLog(@"%@",a);
}
return 0;
}
注意,在使用NSLog打印对象的时候,其实是打印对象调用description属性返回的字符串对象
。
这是description属性的原型,该属性是在NSObject类里边定义的。
@property (readonly, copy) NSString *description;
默认情况下,该函数返回类的名称和当前对象的地址。
看下面代码,我们定义一个类A
@interface A : NSObject
@end
下面开始打印A的对象
int main(int argc, const char * argv[]) {
@autoreleasepool {
A* a = [[A alloc] init];
NSLog(@"%@",a);
}
return 0;
}
返回结果:
现在我们重新给A添加description方法。
@interface A : NSObject
-(NSString*)description;
@end
@implementation A
-(NSString*)description
{
return @"this is class A.";
}
@end
再次打印,发现输出结果已经变成
this is class A.
#NSString
NSString对象包含很多方法和属性,下面列出常用的方法
// 创建一个空字符串
+ (instancetype)string;
// 创建一个字符串的拷贝,注意,这两个字符串是深拷贝,二者
// 并没有什么关系
+ (instancetype)stringWithString:(NSString *)string NS_FORMAT_ARGUMENT(1);
// 通过指定的format和参数argl ,arg2.arg3...
// 创建一个新字符串,这是最常用的方式
+ (instancetype)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
// 创建一个新字符串,并将其设置为url的内容,使用字符编码enc,如果非零,则返回error中的错误
+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
// 创建一个新字符串,并将其设置为path指定的文件的内容,
// 使用字符编码enc,如果非零,则返回error中的错误
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
// 创建一个字符串的拷贝,注意,这两个字符串是深拷贝,二者
// 并没有什么关系
- (instancetype)initWithString:(NSString *)aString NS_FORMAT_ARGUMENT(1);
// 通过指定的format和参数argl ,arg2.arg3...
// 创建一个新字符串,这是最常用的方式
- (instancetype)initWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
// 创建一个新字符串,并将其设置为url的内容,使用字符编码enc,如果非零,则返回error中的错误
- (nullable instancetype)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
// 将字符串设置为Path指定的文件内容
- (nullable instancetype)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
-(NSUInteger)length;
如果我们需要查找字符串中的特定字符或者特定字符串,可以使用下面的方法
// 从头开始查询特定字符串A的位置
// 查询规则如下:
// 1. 如果在字符串中找到A,返回第一个匹配的位置和A的长度
// 2. 如果没有找到A,匹配位置返回-1,长度返回0
- (NSRange)rangeOfString:(NSString *)searchString;
// 查询规则和上面的方法一样,不过多了一个选项
// 一般我们用到的选项有:
// 1. NSBackwardsSearch,从后向前查询,这个比较常用
// 2. NSCaseInsensitiveSearch,不考虑字符串的大小写
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;
下面是一个根据文件全路径获取文件名称的例子:
-(NSString*)getFileName:(NSString*)path
{
NSString* fileName = path;
if([path containsString:@"/"])
{
NSRange range =[path rangeOfString:@"/" options:NSBackwardsSearch];
fileName = [path substringFromIndex:range.location+1];
}
if([fileName containsString:@"."])
{
NSRange range =[fileName rangeOfString:@"." options:NSBackwardsSearch];
fileName =[fileName substringToIndex: range.location];
}
return fileName;
}
// 从头开始截取到to的位置
// 注意:
// 1. to是从0开始的索引
// 2. 不包含to的位置
- (NSString *)substringToIndex:(NSUInteger)to;
看下面例子:
NSString * s = @"0123456789";
NSLog(@"%@",[s substringToIndex:3]);
运行结果:
012
// 从from开始截取,一直到最后
// 注意:
// 1. from是从0开始的索引
// 2. 包含from的位置
- (NSString *)substringFromIndex:(NSUInteger)from;
看下面例子:
NSString * s = @"0123456789";
NSLog(@"%@",[s substringFromIndex:3]);
运行结果:
3456789
// 使用range表示的范围截取字符串
// 注意:
// 截取包含range的开始位置
// 必须保证range在正确范围内,否则会崩溃
- (NSString *)substringWithRange:(NSRange)range;
看下面例子:
NSString * s = @"0123456789";
NSRange range = NSMakeRange(3, 4);
NSLog(@"%@",[s substringWithRange:range]);
运行结果:
3456
// 比较两个字符串
- (NSComparisonResult)compare:(NSString *)string;
// 比较两个字符串,忽略大小写
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;
NSComparisonResult是一个枚举类型,有三个值
[A compare:B]
具体的比较规则是这样的:
从头开始比较A和B的每个字符:
// 测试字符串是否以str开始
- (BOOL)hasPrefix:(NSString *)str;
// 测试字符串是否以str结束
- (BOOL)hasSuffix:(NSString *)str;
// 比较两个字符串是否相等
- (BOOL)isEqualToString:(NSString *)aString;
注意:比较两个字符串内容是否相等的话千万别用==,用这个方法
看下面的例子:
NSString * s = @"0123456789";
NSString * s1 = @"01234567";
NSString * s2 = [s1 stringByAppendingString:@"89"];
if(s == s2)
{
NSLog(@"s==s2");
}
else
{
NSLog(@"s!=s2");
}
这个例子打印结果会是s!=s2
如果我们用isEqualToString,就会打印s==s2
// 将字符串的所有字母变为大写
@property (readonly, copy) NSString *uppercaseString;
// 将字符串的所有字母变为小些
@property (readonly, copy) NSString *lowercaseString;
//将每个单词的首字母变为大写,其余字母变为小写
@property (readonly, copy) NSString *capitalizedString;
@property (readonly) double doubleValue;
@property (readonly) float floatValue;
@property (readonly) int intValue;
@property (readonly) NSInteger integerValue API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@property (readonly) long long longLongValue API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@property (readonly) BOOL boolValue API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0),
当我们使用NSString创建一个字符串的时候,默认是一个不可变字符串,也就是说无论是我们截取字符串,或者对字符串进行大小写切换,都会产生一个新的字符串,看下面的例子:
NSString * s = @"01234567890";
NSString * s1 = [s stringByAppendingString:@"0"];
NSString * s2 = [s substringToIndex:3];
NSString * s3 = [s substringFromIndex:3];
NSString * s4 = [s uppercaseString];
NSLog(@"&s = %p",s);
NSLog(@"&s = %p",s1);
NSLog(@"&s = %p",s2);
NSLog(@"&s = %p",s3);
NSLog(@"&s = %p",s4);
下面是一个打印结果
&s = 0x100004088
&s = 0x600000c00ba0
&s = 0xa747e51693e8bc7d
&s = 0xa7790060eba60aa5
&s = 0x600000c00bd0
每个字符串都有一个新的地址。
NSMutableString是可变字符串,是NSString的子类,NSMutableString在内部使用可变数组保存字符数据,下面是NSMutableString常用的方法
// capacity是初始化字符串时分配的数组大小
+ (NSMutableString *)stringWithCapacity:(NSUInteger)capacity;
- (NSMutableString *)initWithCapacity:(NSUInteger)capacity;
// 将字符串设置为aString
- (void)setString:(NSString *)aString;
// 将字符串拼接到现在字符串的后面
- (void)appendString:(NSString *)aString;
// 使用格式化字符串进行拼接
- (void)appendFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
// 删除指定范围的字符串
- (void)deleteCharactersInRange:(NSRange)range;
// 在loc位置的前面插入字符串
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
// 用字符串aString替换现在字符串range区域
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;
// 使用字符串replacement替换所有的target
- (NSUInteger)replaceOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange;
下面是一个综合的例子
NSMutableString* ms = [NSMutableString stringWithCapacity:20];
NSLog(@"&ms = %@",ms);
[ms setString:@"start::"];
NSLog(@"&ms = %@",ms);
[ms appendString:@"appendString,"];
NSLog(@"&ms = %@",ms);
[ms appendFormat:@"appendFormat%i",123];
NSLog(@"&ms = %@",ms);
[ms deleteCharactersInRange:NSMakeRange(ms.length-3, 3)];
NSLog(@"&ms = %@",ms);
[ms insertString:@"ecalper" atIndex:0];
[ms insertString:@"replace" atIndex:ms.length];
NSLog(@"&ms = %@",ms);
[ms replaceCharactersInRange:NSMakeRange(0, 7) withString:@"replace"];
NSLog(@"&ms = %@",ms);
[ms replaceOccurrencesOfString:@"replace" withString:@"" options:0 range:NSMakeRange(0, ms.length)];
NSLog(@"&ms = %@",ms);
结果如下:
&ms =
&ms = start::
&ms = start::appendString,
&ms = start::appendString,appendFormat123
&ms = start::appendString,appendFormat
&ms = ecalperstart::appendString,appendFormatreplace
&ms = replacestart::appendString,appendFormatreplace
&ms = start::appendString,appendFormat