NSString 字符串

前言

  • NSString:字符串

    • Objective-C

      1
      2
      @interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
      @interface NSMutableString : NSString
    • Swift

      1
      public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding
  • String:字符串

    • Swift

      1
      public struct String
    • Swift 语言主要使用 String 和 Character 来存储字符数据。String 是字符串类型,Character 是字符类型,一个或多个字符组成一个字符串。

    • String:字符串

      • Swift 语言中的 String 类型与经典 Cocoa 或 Cocoa Touch 框架中的 Foundation NSString 类型进行了无缝衔接,Swift 语言中的 String 类型实现了 NSString 的大部分属性和方法,字符串搜索、拷贝、插入、删除等操作都有相应的 API 函数可以使用。

      • String 类型可以调用 NSString 类型的属性和方法,但是 NSString 类型不可以调用 String 类型独有的方法。并且以往框架中的任何要求使用 NSString 类型作为参数的函数,都可以使用 String 类型来替换,Swift 语言会自动将 String 类型转换为 NSString 类型。

      • Swift 语言中可以用 as 将 NSString 类型字符串转换为 String 类型。

        • 如:var str:String = (NSString(string: "beijing") as String)
      • Swift 语言中 String 类型声明为变量就可以被修改。而在 OC 中,需要通过选择 NSString 和 NSMutableString 来指定字符串是否可以被修改。

      • Swift 语言中不能直接将字符串当作字符数组那样通过使用下标访问指定字符。

      • Swift 语言支持字符串插值,你可以在长字符串中插入常量、变量、字面量和表达式,而不用经过特殊的转换,这使得创建用于展示、存储和打印的自定义字符串变的轻松自如。插入的值放在 “ ( ) ” 的括号中。

        • 如:let gameName = "2048"; print("hello my program name is \(gameName)")
      • Swift 语言使用值传递作为默认字符串拷贝方式,无论何时,传递的都是值的拷贝,当我们对 String 类型的变量或者常量进行赋值操作或当作函数/方法的参数传递时,这个变量或者常量的值会被拷贝,然后使用这个拷贝出的值进行赋值或者当作参数传递。

      • Swift 语言由于没有 length 属性,统计字符个数需要使用新的方法,在 Swift 2.2 中使用 characters.count 获取字符串中字符数量。NSString 的 length 属性在被 Swift 的 String 值访问时会被转换为 utf16count。所以 lrngth 属性是基于 UTF-16 表示的十六位 code units 数量,而不是基于 Unicode 字符,所以通过 count 返回的字符串数量并不总是与相同字符的 NSString 的 length 属性值相同。

        • 如:let str = "hello world"; print( str.characters.count )
    • Character:字符

      • 由于全面支持 Unicode 字符,每一个字符值代表一个 Unicode 字符,在 Swift 语言中表示字符使用 Character 类型。

      • Swift 语言声明字符时需要加上类型名称,否则会被推断为 String 类型。

        • 如:var doller:Character = "$"

1、NSString 不可变字符串的创建

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    // 直接创建不可变字符串
    /*
    在 OC 中,使用 @"XXX" 格式定义的字符串,是保存在常量区的,只要内容相同,内存地址就一致
    */
    NSString *string1 = @"bei jing huan ying nin";

    // 对象方法创建字符串

    NSString *string2 = [[NSString alloc] init];

    // 用另一个字符串初始化当前字符串,和 string1 的地址相同
    NSString *string3 = [[NSString alloc] initWithString:string1];

    // 通过格式化控制初始化字符串
    NSString *string4 = [[NSString alloc] initWithFormat:@"age is %d, name is %@", 18, @"chen chao"];

    // 类方法创建字符串

    NSString *string5 = [NSString string];

    // 用另一个字符串初始化当前字符串,和 string1 的地址相同
    NSString *string6 = [NSString stringWithString:string1];

    // 通过格式化控制初始化字符串
    NSString *string7 = [NSString stringWithFormat:@"age is %d, name is %@", 18, @"chen chao"];

    // 由 C 语言的字符串创建字符串
    NSString *string8 = [[NSString alloc] initWithCString:"bei jing nin hao" encoding:NSUTF8StringEncoding];
    NSString *string9 = [[NSString alloc] initWithUTF8String:"bei jing huan ying nin"];

    NSString *string10 = [NSString stringWithCString:"bei jing nin hao" encoding:NSUTF8StringEncoding];
    NSString *string11 = [NSString stringWithUTF8String:"bei jing huan ying nin"];

    // 从 文件 创建字符串
    NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"];

    NSString *string12 = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
    NSString *string13 = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];

    // 从 Url 创建字符串
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];

    NSString *string14 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:NULL];
    NSString *string15 = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:NULL];

2、NSString/String 字符串长度计算

2.1 NSString 字符串长度计算

  • Objective-C

    1
    2
    3
    4
    NSString *str1 = @"zhou dong yu";

    // 计算字数长度,不是字符长度
    NSUInteger length = [str1 length];
  • Swift

    1
    2
    3
    4
    let str2: NSString = "hello world"

    // 计算字符串中字数长度,不是字符长度
    let num2: Int = str2.length

2.2 String 字符串长度计算

  • Swift

    1
    2
    3
    4
    let str1: String = "zhou dong yu"

    // 计算字符串中字数长度,不是字符长度,代替 count(str1)
    let num1: Int = str1.characters.count

3、NSString/String 字符串成员的引用(取字符)

3.1 NSString 字符串成员的引用

  • Objective-C

    1
    2
    3
    4
    NSString *str1 = @"zhou dong yu";

    // 取第 4 个字符
    unichar character = [str1 characterAtIndex:3];
  • Swift

    1
    2
    3
    4
    let str2: NSString = "bei jing ni hao"

    // 取第5个字符
    let substr2: unichar = str2.characterAtIndex(4)

3.2 String 字符串成员的引用

  • Swift

    1
    2
    3
    4
    let str1: String = "bei jing ni hao"

    // 取第5个字符
    let substr1: String = str1.substringWithRange(str1.startIndex.advancedBy(4)...str1.startIndex.advancedBy(4))

4、NSString/String 字符串的拼接

4.1 NSString 字符串的拼接

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    NSString *str1 = @"chen chao ";
    NSString *str2 = @"shuai";

    // stringByAppendingString
    NSString *str3 = [str1 stringByAppendingString:str2];

    // stringByAppendingFormat
    NSString *str4 = [str1 stringByAppendingFormat:@"%@", str2];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    let str7: NSString = "bei "
    let str8: NSString = "jing "

    // 参数和返回值都为 String 型
    let str9: String = str7.stringByAppendingString((str8 as String))

    // 参数和返回值都为 NSString 型
    let str10: NSString = str7.stringByAppendingFormat(str8)
    let str11: NSString = str7.stringByAppendingFormat("%@", "jing huan ying ni")

    // NSMutableString 型字符串
    let str12: NSMutableString = "bei "

    // 追加
    str12.appendString("jing ")

    // 格式化追加
    str12.appendFormat("age is %d", 18)

4.2 String 字符串的拼接

  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    let str1: String = "bei "
    let str2: String = "jing "

    // 使用 "+" 号连接两个字符串
    var str3: String = str1 + str2

    // 在字符串的末尾拼接字符串,代替 str3.extend("123456789")
    str3.write("123456789")

    // 参数和返回值都为 String 型
    let str4: String = str1.stringByAppendingString(str2)

    // 参数和返回值都为 String 型
    let str5: String = str1.stringByAppendingFormat(str2)
    let str6: String = str1.stringByAppendingFormat("%@", "jing huan ying ni")

5、NSString/String 字符串比较

5.1 NSString 字符串比较

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    NSString *str1 = @"chen chao";
    NSString *str2 = @"CHEN CHAO";

    // isEqualToString

    BOOL bl = [str1 isEqualToString:str2];

    if (bl) {

    // 相等
    NSLog(@"str1 = str2");
    }
    else {

    // 不等
    NSLog(@"str1 != str2");
    }

    // compare

    NSComparisonResult result1 = [str1 compare:str2];

    if (result1 == NSOrderedAscending) {

    // 小于 -1
    NSLog(@"str1 < str2");
    }
    else if (result1 == NSOrderedSame){

    // 等于 0
    NSLog(@"str1 = str2");
    }
    else{

    // 大于 1 NSOrderedDescending
    NSLog(@"str1 > str2");
    }

    // caseInsensitiveCompare

    // 忽略大小写比较

    NSComparisonResult result2 = [str1 caseInsensitiveCompare:str2];

    if (result2 == NSOrderedAscending) {

    // 小于 -1
    NSLog(@"str1 < str2");
    }
    else if (result2 == NSOrderedSame){

    // 等于 0
    NSLog(@"str1 = str2");
    }
    else{

    // 大于 1 NSOrderedDescending
    NSLog(@"str1 > str2");
    }
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    let str3: NSString = "bei jing"
    let str4: NSString = "BEI JING"

    // 判读两个字符串是否相等
    let bl5: Bool = str3 == str4

    // 判读两个字符串是否相等
    let bl6: Bool = str3.isEqual(str4)

    // 判读两个字符串是否相等
    let bl7: Bool = str3.isEqualToString(str4 as String)

    // 忽略大小写比较
    let result3: NSComparisonResult = str3.compare(str4 as String)
    let result4: NSComparisonResult = str3.caseInsensitiveCompare(str4 as String)

5.2 String 字符串比较

  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let str1: String = "bei jing"
    let str2: String = "BEI JING"

    // 判读两个字符串是否相等
    let bl1: Bool = str1 == str2

    // 判断字符串是否为空
    let bl2: Bool = str1.isEmpty

    // 比较两个字符串
    let result1: NSComparisonResult = str1.compare(str2)

    // 忽略大小写比较
    let result2: NSComparisonResult = str1.caseInsensitiveCompare(str2)

6、NSString/String 字符串前缀和后缀的判断

6.1 NSString 字符串前缀和后缀的判断

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    NSString *fileName = @"file.txt";

    // 前缀
    BOOL bl1 = [fileName hasPrefix:@"file"];

    // 后缀
    BOOL bl2 = [fileName hasSuffix:@".txt"];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    let str3: NSString = "bei jing"
    let str4: NSString = "BEI JING"

    // 前缀
    let bl8: Bool = str3.hasPrefix("be")

    // 后缀
    let bl9: Bool = str3.hasSuffix("ing")

6.2 String 字符串前缀和后缀的判断

  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    let str1: String = "bei jing"
    let str2: String = "BEI JING"

    // 前缀
    let bl3: Bool = str1.hasPrefix("be")

    // 后缀
    let bl4: Bool = str2.hasSuffix("ing")

7、NSString/String 字符串大小写字符的转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    NSString *str = @"chEN Chao";

    // 转大写
    NSString *str1 = [str uppercaseString];

    // 转小写
    NSString *str2 = [str lowercaseString];

    // 单词首字母大写
    NSString *str3 = [str capitalizedString];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // String 或 NSString 型字符串 返回值都为 String 型

    let str1 = "bei JING"

    // 将字符串转换为大写
    let str2 = str1.uppercaseString

    // 将字符串转换为小写
    let str3 = str1.lowercaseString

    // 将字符串的单词首字母大写
    let str4 = str1.capitalizedString

8、NSString/String 字符串与数字的相互转换

8.1 NSString 字符串与数字的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 字符 转 数字

    NSString *str = @"12306";

    int intValue = [str intValue];

    double doubleValue = [str doubleValue];

    float floatValue = [str floatValue];

    BOOL boolValue = [str boolValue];

    NSInteger integerValue = [str integerValue];

    long long longLongValue = [str longLongValue];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 字符 转 数字

    // 字符串 转 Int 型数字
    let intVal4: Int = NSString(string: "6432").integerValue

    // 字符串 转 Int32 型数字
    let int32Val2: Int32 = NSString(string: "32").intValue

    // 字符串 转 Int64 型数字
    let int64Val2: Int64 = NSString(string: "64").longLongValue

    // 字符串 转 Float 型数字
    let floatVal2: Float = NSString(string: "2.1").floatValue

    // 字符串 转 Double 型数字
    let doubleVal2: Double = NSString(string: "162.1").doubleValue

    // 字符串 转 Bool 型
    let boolVal2: Bool = NSString(string: "false").boolValue

8.2 String 字符串与数字的相互转换

  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    // 字符 转 数字

    let char: Character = "A";

    var charVal1: Int = 0

    // 遍历字符转换为的字符串
    for charStr in String(char).unicodeScalars {

    // 将取出的字符转换为 Int 型数字
    charVal1 = Int(charStr.value)
    }

    // 字符串 转 数字

    // 数字型字符串 转 Int 型数字,代替 intStr.toInt()
    let intStr: String = "64"; let intVal1: Int? = Int(intStr)

    // 数字 转 字符
    let intVal2 = 65; let charVal2: Character = Character(UnicodeScalar(intVal2))

    // 数字 转 字符串

    // Int 型数字 转 字符串
    let intVal3: Int = 123; let intStr1: String = intVal3.description

    // Int32 型数字 转 字符串
    let int32Val1: Int32 = 32; let int32Str1: String = int32Val1.description

    // Int64 型数字 转 字符串
    let int64Val1: Int64 = 64; let int64Str1: String = int64Val1.description

    // Float 型数字转 字符串
    let floatVal1: Float = 2.1; let floatStr1: String = floatVal1.description

    // Double 型数字转 字符串
    let doubleVal1: Double = 162.1; let doubleStr1: String = doubleVal1.description

    // Bool 型 转 字符串
    let boolVal1: Bool = true; let boolStr1: String = boolVal1.description

9、NSString/String 在字符串中查找子串的位置

9.1 NSString 在字符串中查找子串的位置

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    NSString *str1 = @"bei jing nin hao nin hao";
    NSString *str2 = @"ninn";

    // 1、从前往后查找,找到第一个即停止查找

    NSRange range1 = [str1 rangeOfString:str2];

    // 或者 if(range1.length == 0)
    if (range1.location == NSNotFound) {

    NSLog(@"没有找到 %@", NSStringFromRange(range1));
    }
    else{

    // location 位置,length 长度
    NSLog(@"%lu %lu", range1.location, range1.length);
    }

    // 2、条件查找

    /*
    NSCaseInsensitiveSearch = 1, // “A”等同于“a”,不分大小写查找
    NSLiteralSearch = 2, // Unicode 的点对点比较。它只在所有字符都用相同的方式组成的情况下才会返回相等。
    NSBackwardsSearch = 4, // 在字符串的末尾开始反向搜索
    NSAnchoredSearch = 8, // 只考虑搜索的起始点(单独使用)或终止点(当与 NSBackwardsSearch 结合使用时)。
    这个方法可以用来检查前缀或者后缀,以及大小写不敏感(case-insensitive)或者
    音调不敏感(diacritic-insensitive)的比较。

    NSNumericSearch = 64, // 它对字符串里的数字排序

    NSDiacriticInsensitiveSearch = 128, // “A” 等同于 “Å” 等同于 “Ä.”
    NSWidthInsensitiveSearch = 256, // 一些东亚文字(平假名和片假名)有全宽与半宽两种形式
    NSForcedOrderingSearch = 512,
    NSRegularExpressionSearch = 1024 // 使用正则表达式搜索
    */

    // 从后往前查找,找到第一个即停止查找
    NSRange range2 = [str1 rangeOfString:str2 options:NSBackwardsSearch];

    if (range2.location == NSNotFound) {
    NSLog(@"没有找到 %@", NSStringFromRange(range2));
    } else {
    NSLog(@"%lu %lu", range2.location, range2.length);
    }

    // 3、在某个范围内查找

    // 查找范围
    NSRange range = {8, 10};

    NSRange range3 = [str1 rangeOfString:str2 options:NSCaseInsensitiveSearch range:range];

    if (range3.location == NSNotFound) {
    NSLog(@"没有找到 %@", NSStringFromRange(range3));
    } else {
    NSLog(@"%lu %lu", range3.location, range3.length);
    }
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    let str1: NSString = "bei jing nin hao nin hao"
    let str2: String = "nin"

    // 顺序查找

    // 从前往后查找,找到第一个即停止查找
    let range1 = str1.rangeOfString(str2)

    // 或者 if(range1.length == 0), location 位置,length 长度
    range1.location == NSNotFound ? print("not found") : print(range1)

    // 条件查找
    /*
    CaseInsensitiveSearch = 1, // “A”等同于“a”,不分大小写查找
    LiteralSearch = 2, // Unicode 的点对点比较。它只在所有字符都用相同的方式组成的情况下才会返回相等。
    BackwardsSearch = 4, // 在字符串的末尾开始反向搜索
    AnchoredSearch = 8, // 只考虑搜索的起始点(单独使用)或终止点(当与 NSBackwardsSearch 结合使用时)。
    // 这个方法可以用来检查前缀或者后缀,以及大小写不敏感(case-insensitive)或者
    // 音调不敏感(diacritic-insensitive)的比较。

    NumericSearch = 64, // 它对字符串里的数字排序

    DiacriticInsensitiveSearch = 128, // “A” 等同于 “Å” 等同于 “Ä.”
    WidthInsensitiveSearch = 256, // 一些东亚文字(平假名和片假名)有全宽与半宽两种形式
    ForcedOrderingSearch = 512,
    RegularExpressionSearch = 1024 // 使用正则表达式搜索
    */

    // 从后往前查找,找到第一个即停止查找
    let range2 = str1.rangeOfString(str2, options: NSStringCompareOptions.BackwardsSearch)

    range2.location == NSNotFound ? print("not found") : print(range2)

    // 范围内查找

    // 在某个范围内查找
    let range3 = str1.rangeOfString(str2,
    options: NSStringCompareOptions.CaseInsensitiveSearch,
    range: NSMakeRange(8, 10))

    range3.location == NSNotFound ? print("not found") : print(range3)

9.2 String 在字符串中查找子串的位置

  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    let str: String = "bei jing ni hao"

    // 获取起始位置,即 0
    let startIndex = str.startIndex

    // 获取结束位置,指 字符串的结束字符 \0 的位置
    let endIndex = str.endIndex

    // 获取指定位置下标值,指从 str.startIndex 开始的第 n 个位置,代替 advance(str.startIndex, 2)
    let index = str.startIndex.advancedBy(2)

    // 获取下标区间值
    let range = str.startIndex.advancedBy(4)...str.startIndex.advancedBy(6)

    // 获取指定位置下标的 前一个值
    let predecessorIndex = str.startIndex.advancedBy(2).predecessor()

    // 获取指定位置下标的 后一个值
    let successorIndex = str.startIndex.advancedBy(2).successor()

10、NSString/String 字符串子串的提取(取子串)

10.1 NSString 字符串子串的提取

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    NSString *str = @"今天天气真不错,是风和日丽的,我们下午没有课,是心情也不错";

    // 从某个位置开始到结尾
    NSString *str1 = [str substringFromIndex:17];

    // 从开始到某个位置
    NSString *str2 = [str substringToIndex:7];

    // 某个范围内
    NSRange range = {7, 10};
    NSString *str3 = [str substringWithRange:range];

    NSRange range1 = [str rangeOfString:@"我们下午没有课"];
    NSString *str4 = [str substringFromIndex:range1.location];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    let str5: NSString = "今天天气真不错,是风和日丽的,我们下午没有课,是心情也不错"

    // 从某个位置开始到结尾
    let str6: String = str5.substringFromIndex(8)

    // 从开始到某个位置
    let str7: String = str5.substringToIndex(18)

    // 某个范围内
    let str8: String = str5.substringWithRange(NSMakeRange(10, 6))

10.2 String 字符串子串的提取

  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    let str1: String = "今天天气真不错,是风和日丽的,我们下午没有课,是心情也不错"

    // 从某个位置开始到结尾
    let str2: String = str1.substringFromIndex(str1.startIndex.advancedBy(8))

    // 从开始到某个位置
    let str3: String = str1.substringToIndex(str1.startIndex.advancedBy(18))

    // 某个范围内
    let str4: String = str1.substringWithRange(str1.startIndex.advancedBy(10)...str1.startIndex.advancedBy(15))

11、NSString/String 字符串切割/组合

11.1 NSString 字符串切割/组合

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    NSString *str1 = @"chen$chao$ni$hao$ma";
    NSString *str2 = @"bei$jing#ni@hao&ma";
    NSString *str3 = @"Users/JHQ0228/Desktop";

    // 字符串 按照字符 切割
    NSArray *arr1 = [str1 componentsSeparatedByString:@"$"];

    // 字符串 按照字符集 切割
    NSArray *arr2 = [str2 componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"$#@&"]];

    // 将字符串 路径分割
    /*
    自动按照 "/" 分割字符串
    */
    NSArray *arr3 = [str3 pathComponents];

    // 字符串 组合
    NSString *str4 = [arr1 componentsJoinedByString:@" "];
    NSString *str5 = [arr2 componentsJoinedByString:@" "];

    // 字符串 路径组合
    /*
    将数组中的元素自动组合成路径,在每个元素之间自动加上 “/”
    */
    NSString *str6 = [NSString pathWithComponents:arr3];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let str3: NSString = "chen$chao$ni$hao$ma"
    let str4: NSString = "bei$jing#ni@hao&ma"
    let str5: NSString = "Users/JHQ0228/Desktop"

    // 字符串 按照字符 切割
    let arr3: Array = str3.componentsSeparatedByString("$")

    // 字符串 按照字符集 切割
    let arr4: Array = str4.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "$#@&"))

    // 自动按照 "/" 分割字符串
    let arr5: Array = str5.pathComponents

11.2 String 字符串切割/组合

  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    let str1: String = "chen$chao$ni$hao$ma"
    let str2: String = "bei$jing#ni@hao&ma"

    // 字符串 按照字符 切割
    let arr1: Array = str1.componentsSeparatedByString("$")

    // 字符串 按照字符集 切割
    let arr2: Array = str2.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "$#@&"))

12、NSMutableString/String 可变字符串的创建

12.1 NSMutableString 可变字符串的创建

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // 不可变字符串中有的方法

    NSMutableString *str1 = [[NSMutableString alloc] init];

    // 和 str1 的地址不同
    NSMutableString *str2 = [[NSMutableString alloc] initWithString:str1];

    // 和 str1 的地址不同
    NSMutableString *str3 = [NSMutableString stringWithString:str1];

    // 对象方法创建
    /*
    创建指定长度字符串,预先分配存储空间,提高效率,字符串实际长度可大于指定的长度
    */
    NSMutableString *str4 = [[NSMutableString alloc] initWithCapacity:0];

    // 类方法创建
    /*
    创建指定长度字符串,预先分配存储空间,提高效率,字符串实际长度可大于指定的长度
    */
    NSMutableString *str5 = [NSMutableString stringWithCapacity:0];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // 直接创建 NSString 类型字符串,未初始化
    let nsStr1: NSString
    let nsStr2: NSString = "123"

    // 由另一个 String 类型字符串创建
    let nsStr3 = NSString(string: str4)

    // 由另一个 NSString 类型字符串创建
    let nsStr4 = NSString(string: nsStr2)

    // 格式化创建 NSString 类型字符串
    let nsStr5 = NSString(format: "age is %d, score is %d", 18, 120)

    // 由 C 语言的字符串创建字符串
    let nsStr6: NSString? = NSString(CString: "bei jing nin hao", encoding: NSUTF8StringEncoding)
    let nsStr7: NSString? = NSString(UTF8String: "bei jing nin hao")

    // 从 文件 创建,try? 异常处理,若文件不存在或读取错误返回 nil
    let path = NSHomeDirectory() + "/Desktop/test.txt"
    let nsStr8: NSString? = try? NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)

    // 从 Url 创建,try? 异常处理,若文件不存在或读取错误返回 nil
    let url = NSURL(fileURLWithPath: NSHomeDirectory() + "/Desktop/test.txt")
    let nsStr9: NSString? = try? NSString(contentsOfURL: url, encoding: NSUTF8StringEncoding)

12.2 String 字符串的创建

  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 创建字符变量,必须指明为 Character 类型,否则会被自动推断为 String
    let str1: Character = "I"

    // 创建字符串变量,指明变量类型,未初始化
    let str2: String

    // 创建字符串变量,指明变量类型,并赋值
    let str3: String = "I Love China"

    // 创建字符串变量,未指明变量类型,自动推断为 String 类型
    let str4 = "Hello World"

    // 直接通过另一个字符串创建,与 str3 的地址不同,是值复制
    let str5: String = str3

13、NSMutableString/String 字符串的添加

13.1 NSMutableString 字符串的添加

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    NSMutableString *str = [NSMutableString stringWithCapacity:0];

    // 追加
    [str appendString:@"bei jing"];

    // 格式化追加
    [str appendFormat:@", age is %d", 18];

    // 插入
    [str insertString:@" ren min" atIndex:8];
  • Swift

    1
    2
    3
    4
    let str2: NSMutableString = "bei jing ying ni"

    // 指定位置插入字符串
    str2.insertString("huan ", atIndex: 9)

13.2 String 字符串的添加

  • Swift

    1
    2
    3
    4
    5
    6
    7
    var str1: String = "bei jing ying ni "

    // 指定位置插入字符,str1.endIndex 字符串末尾位置
    str1.insert("!", atIndex: str1.endIndex)

    // 指定位置插入字符串,替代 str1.splice
    str1.insertContentsOf("huan ".characters, at: str1.startIndex.advancedBy(9))

14、NSMutableString 字符串修改(覆盖重写)

  • Objective-C

    1
    2
    3
    4
    NSMutableString *str = [NSMutableString stringWithFormat:@"%@", @"我是大大的好人"];

    // 修改整个字符串(覆盖重写)
    [str setString:@"bei jing huan ying nin"];
  • Swift

    1
    2
    3
    4
    let str2: NSMutableString = "bei jing ying ni"

    // 重写全部字符串
    str2.setString("nan jing huan ying ni")

15、NSMutableString/String 字符串的删除

15.1 NSMutableString 字符串的删除

  • Objective-C

    1
    2
    3
    4
    NSMutableString *str = [NSMutableString stringWithFormat:@"%@", @"bei jing ren min huan ying nin"];

    NSRange range = [str rangeOfString:@"ren min "];
    [str deleteCharactersInRange:range];
  • Swift

    1
    2
    3
    4
    let str2: NSMutableString = "bei jing ren min huan ying nin !"

    // 删除指定范围的字符串
    str2.deleteCharactersInRange(NSMakeRange(9, 8))

15.2 String 字符串的删除

  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var str1: String = "bei jing ren min huan ying nin !"

    // 指定位置删除字符 "!"
    str1.removeAtIndex(str1.endIndex.predecessor())

    // 指定范围删除字符串 "ren min "
    str1.removeRange(str1.startIndex.advancedBy(9)...str1.startIndex.advancedBy(16))

    // 删除全部字符串
    str1.removeAll(keepCapacity: true)

16、NSMutableString/String 字符串替换

16.1 NSMutableString 字符串替换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    NSMutableString *str1 = [NSMutableString stringWithFormat:@"%@", @"bei jing ren min huan ying nin"];

    // 替换字符串
    [str1 replaceCharactersInRange:[str1 rangeOfString:@"huan ying nin"] withString:@"ni hao ma"];

    // 查找并替换字符串
    [str1 replaceOccurrencesOfString:@"i" withString:@"X" options:NSLiteralSearch range:NSMakeRange(0, [str1 length])];

    /*
    NSCaseInsensitiveSearch = 1, // “A”等同于“a”,不分大小写查找
    NSLiteralSearch = 2, // Unicode 的点对点比较。它只在所有字符都用相同的方式组成的情况下才会返回相等。
    NSBackwardsSearch = 4, // 在字符串的末尾开始反向搜索
    NSAnchoredSearch = 8, // 只考虑搜索的起始点(单独使用)或终止点(当与 NSBackwardsSearch 结合使用时)。
    这个方法可以用来检查前缀或者后缀,以及大小写不敏感(case-insensitive)或者
    音调不敏感(diacritic-insensitive)的比较。
    NSNumericSearch = 64, // 它对字符串里的数字排序
    NSDiacriticInsensitiveSearch = 128, // “A” 等同于 “Å” 等同于 “Ä.”
    NSWidthInsensitiveSearch = 256, // 一些东亚文字(平假名和片假名)有全宽与半宽两种形式
    NSForcedOrderingSearch = 512,
    NSRegularExpressionSearch = 1024 // 使用正则表达式搜索
    */
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var str2: NSMutableString = "bei jing huan ying nin !"

    // 替换指定位置的字符串
    str2.replaceCharactersInRange(NSMakeRange(9, str2.length - 9), withString: "ni hao")

    // 查找并替换指定的字符串
    str2.replaceOccurrencesOfString( "in",
    withString: "IN",
    options: NSStringCompareOptions.LiteralSearch,
    range: NSMakeRange(0, str2.length))

16.2 String 字符串替换

  • Swift

    1
    2
    3
    4
    var str1: String = "bei jing huan ying nin !"

    // 用字符替换指定位置的字符串
    str1.replaceRange(str1.startIndex...str1.startIndex.advancedBy(2), with: "I")

17、NSString/String 字符串的输出

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    // 文件路径
    NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Desktop/string.txt"];

    // 待导出字符串
    NSString *str = @"bei jing ni hao";

    // 导出字符串

    /*
    - (BOOL)writeToFile:(NSString *)path
    atomically:(BOOL)useAuxiliaryFile
    encoding:(NSStringEncoding)enc
    error:(NSError **)error;

    atomically:原子性,
    YES:原子性操作,数据写入文件时先写入临时文件,待数据全部写入临时文件后,再创建并将数据
    从临时文件全部剪切到目标文件中。若写入过程中(指往临时文件中写入)发生错误,会删除临时文件。
    NO:非原子性操作,数据写入文件时直接创建并写入目标文件。
    若写入过程中发生错误,会停止写入,不会删除目标文件,并且不会删除已写入的数据。
    error:错误数据。error == nil 时写入成功。

    文件不存在时会自动创建,文件夹不存在时会写入错误。
    */

    // 不判断是否写入成功

    [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];

    // 判断是否写入成功

    NSError *error;

    [str writeToFile:[NSHomeDirectory() stringByAppendingString:@"/Desktop/str/string.txt"]
    atomically:YES encoding:NSUTF8StringEncoding
    error:&error];

    if (error) {

    NSLog(@"写入失败:%@", error);

    // 打印主要错误信息
    NSLog(@"写入失败:%@", [error localizedDescription]);
    } else {
    NSLog(@"写入成功");
    }
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    let num: Int = 123

    // 直接输出 自动换行
    print(num)

    // 使用字符串插值输出 自动换行 输出常量或变量
    print("\(num)")

    // 使用强制类型转换输出 自动换行 输出常量或变量
    print(String(num))

    // 使用输出控制符输出 自动换行 且输出时间等信息 输出常量或变量
    NSLog("%d", num)

    // 使用字符串插值输出 自动换行 且输出时间等信息 输出常量或变量
    NSLog("\(num)")

    // 使用强制类型转换输出 自动换行 且输出时间等信息 输出常量或变量
    NSLog(String(num))

18、OC 字符串与 C 字符串的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // OC 字符串转 C 字符串
    const char *CString = [@"bei jing ni hao" UTF8String];

    // C 字符串转 OC 字符串
    NSString *OCString1 = [[NSString alloc] initWithCString:"ni hao" encoding:NSUTF8StringEncoding];
    NSString *OCString2 = [[NSString alloc] initWithUTF8String:"ni hao"];

    NSString *OCString3 = [NSString stringWithCString:"ni hao" encoding:NSUTF8StringEncoding];
    NSString *OCString4 = [NSString stringWithUTF8String:"ni hao"];

19、NSString 与 NSData 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    NSString *string = @"bei jing nin hao";

    // NSString 转 NSData
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

    // data 类型数据以十六进制的形式打印出
    NSLog(@"%@", data);

    // data 类型数据以字符串的形式打印出
    NSLog(@"%s", data.bytes);

    // NSData 转 NSString
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

20、NSString 与 NSNumber 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    NSNumber *num1 = @10.456;

    // NSNumber 转换 NSString
    NSString *str = [num1 stringValue];

    // NSString 转 NSNumber
    NSNumber *num2 = [NSNumber numberWithFloat:[str floatValue]];

21、NSString 与 NSDate 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    NSDateFormatter *dfm = [[NSDateFormatter alloc] init];
    dfm.dateFormat = @"yyyy年MM月dd日 HH点mm分ss秒";
    dfm.locale = [NSLocale localeWithLocaleIdentifier:@"GMT+8"];

    // NSString 转 NSDate
    NSDate *date = [dfm dateFromString:@"2016年05月24日 17点38分03秒"];

    // NSDate 转 NSString
    NSString *str = [dfm stringFromDate:date];

22、NSString 与 Class 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    // NSString 转 Class
    Class ClassName = NSClassFromString(@"Student");

    Student *stu = [[ClassName alloc] init];
    [stu studentTest];

    // Class 转 NSString
    NSString *strintFromClass = NSStringFromClass([Student class]);

23、NSString 与 方法名 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // NSString 转 方法名
    SEL selName = NSSelectorFromString(@"studentTest");

    // 消除 performSelector: 方法警告
    #pragma clang diagnostic push

    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"

    Student *stu = [[Student alloc] init];
    [stu performSelector:selName];

    #pragma clang diagnostic pop

    // 方法名 转 NSString
    NSString *stringFromSel = NSStringFromSelector(@selector(studentTest));

24、NSString 与 NSProtocol 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    // NSString 转 NSProtocol
    Protocol *ptlName = NSProtocolFromString(@"NSCopying");

    Student *stu = [[Student alloc] init];
    BOOL conforms = [stu conformsToProtocol:ptlName];

    // NSProtocol 转 NSString
    NSString *stringFromProtocol = NSStringFromProtocol(@protocol(NSCopying));

25、NSString 与 NSRange 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    NSRange range4 = NSMakeRange(9, 4);

    // NSRange 转 NSString
    NSString *stringFronRange = NSStringFromRange(range4);

    // NSString 转 NSRange
    NSRange range5 = NSRangeFromString(stringFronRange);

26、NSString 与 NSPoint 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    NSPoint point5 = NSMakePoint(9, 4);

    // NSPoint 转 NSString
    NSString *stringFronPoint = NSStringFromPoint(point5);

    // NSString 转 NSPoint
    NSPoint point6 = NSPointFromString(stringFronPoint);

27、NSString 与 NSSize 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    NSSize size5 = NSMakeSize(9, 4);

    // NSSize 转 NSString
    NSString *stringFronSize = NSStringFromSize(size5);

    // NSString 转 NSSize
    NSSize size6 = NSSizeFromString(stringFronSize);

28、NSString 与 NSRect 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    NSRect rect5 = NSMakeRect(9, 4, 4, 9);

    // NSRect 转 NSString
    NSString *stringFronRect = NSStringFromRect(rect5);

    // NSString 转 NSRect
    NSRect rect6 = NSRectFromString(stringFronRect);

29、生成随机数

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // 生成 15 位长度的数字字母组合的随机数
    - (NSString *)generateTradeNO {

    static int kNumber = 15;

    NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSMutableString *resultStr = [[NSMutableString alloc] init];
    srand((unsigned)time(0));
    for (int i = 0; i < kNumber; i++)
    {
    unsigned index = rand() % [sourceStr length];
    NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
    [resultStr appendString:oneStr];
    }

    return resultStr;
    }
文章目录
  1. 1. 前言
  2. 2. 1、NSString 不可变字符串的创建
  3. 3. 2、NSString/String 字符串长度计算
    1. 3.1. 2.1 NSString 字符串长度计算
    2. 3.2. 2.2 String 字符串长度计算
  4. 4. 3、NSString/String 字符串成员的引用(取字符)
    1. 4.1. 3.1 NSString 字符串成员的引用
    2. 4.2. 3.2 String 字符串成员的引用
  5. 5. 4、NSString/String 字符串的拼接
    1. 5.1. 4.1 NSString 字符串的拼接
    2. 5.2. 4.2 String 字符串的拼接
  6. 6. 5、NSString/String 字符串比较
    1. 6.1. 5.1 NSString 字符串比较
    2. 6.2. 5.2 String 字符串比较
  7. 7. 6、NSString/String 字符串前缀和后缀的判断
    1. 7.1. 6.1 NSString 字符串前缀和后缀的判断
    2. 7.2. 6.2 String 字符串前缀和后缀的判断
  8. 8. 7、NSString/String 字符串大小写字符的转换
  9. 9. 8、NSString/String 字符串与数字的相互转换
    1. 9.1. 8.1 NSString 字符串与数字的相互转换
    2. 9.2. 8.2 String 字符串与数字的相互转换
  10. 10. 9、NSString/String 在字符串中查找子串的位置
    1. 10.1. 9.1 NSString 在字符串中查找子串的位置
    2. 10.2. 9.2 String 在字符串中查找子串的位置
  11. 11. 10、NSString/String 字符串子串的提取(取子串)
    1. 11.1. 10.1 NSString 字符串子串的提取
    2. 11.2. 10.2 String 字符串子串的提取
  12. 12. 11、NSString/String 字符串切割/组合
    1. 12.1. 11.1 NSString 字符串切割/组合
    2. 12.2. 11.2 String 字符串切割/组合
  13. 13. 12、NSMutableString/String 可变字符串的创建
    1. 13.1. 12.1 NSMutableString 可变字符串的创建
    2. 13.2. 12.2 String 字符串的创建
  14. 14. 13、NSMutableString/String 字符串的添加
    1. 14.1. 13.1 NSMutableString 字符串的添加
    2. 14.2. 13.2 String 字符串的添加
  15. 15. 14、NSMutableString 字符串修改(覆盖重写)
  16. 16. 15、NSMutableString/String 字符串的删除
    1. 16.1. 15.1 NSMutableString 字符串的删除
    2. 16.2. 15.2 String 字符串的删除
  17. 17. 16、NSMutableString/String 字符串替换
    1. 17.1. 16.1 NSMutableString 字符串替换
    2. 17.2. 16.2 String 字符串替换
  18. 18. 17、NSString/String 字符串的输出
  19. 19. 18、OC 字符串与 C 字符串的相互转换
  20. 20. 19、NSString 与 NSData 的相互转换
  21. 21. 20、NSString 与 NSNumber 的相互转换
  22. 22. 21、NSString 与 NSDate 的相互转换
  23. 23. 22、NSString 与 Class 的相互转换
  24. 24. 23、NSString 与 方法名 的相互转换
  25. 25. 24、NSString 与 NSProtocol 的相互转换
  26. 26. 25、NSString 与 NSRange 的相互转换
  27. 27. 26、NSString 与 NSPoint 的相互转换
  28. 28. 27、NSString 与 NSSize 的相互转换
  29. 29. 28、NSString 与 NSRect 的相互转换
  30. 30. 29、生成随机数
隐藏目录