swift 字符串 String NSString

2,922 阅读4分钟

一. StringNSString 的根本区别

  • String 是结构体,结构体是“值类型”,所以 String 也是值类型。
  • 值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。
  • NSString 是类,类是“引用类型”,所以NSString 也是引用类型。
  • 引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,引用的是已存在的实例本身而不是其拷贝。

二. StringNSString 独有的API

2.1 String 独有的API

2.1.1 初始化 String

        var str = String()
        str = "123456"

2.1.2 StringisEmpty 属性

  • 判断字符串是否为空
        var str = String();
        str = "123456";
        print(str.isEmpty);
        // false
        var str = String();
        print(str.isEmpty);
        // true
        var str = "";
        print(str.isEmpty);
        // true

2.1.3 Stringsorted() 方法:

  • 字符串排序并输出字符的数组
        var str = "215423";
        print(str.sorted());
        //["1", "2", "2", "3", "4", "5"]

2.1.4 Stringfilter() 方法

  • 过滤不要的字符
        let str = "12 34 56";
        let filter = str.filter { (char) -> Bool in
            char != " "
        };
        print(filter);
        //123456

2.1.5 Stringenumerated() 方法:

        let str = "123456";
        for data in str.enumerated() {
            print(data);
        }
        
        /*
        (offset: 0, element: "1")
        (offset: 1, element: "2")
        (offset: 2, element: "3")
        (offset: 3, element: "4")
        (offset: 4, element: "5")
        (offset: 5, element: "6")
        */

2.2 NSString 独有的API

2.2.1 初始化一个NSString

        var nsStr = NSString();
        nsStr = "123456";
        print(nsStr);
        var nsStr = NSString(stringLiteral: "123456");
        var nsStr = NSString.init(string: "123456");

2.2.1 NSStringboolValue 属性

  • 首字符为 Y、y、T、t、非0数字 返回true,否则返回false
        var nsStr = NSString(stringLiteral: "123456");
        print(nsStr.boolValue);
        //true

2.2.2 NSStringisEqual() 方法

  • 判断两个字符串是否相等
        var nsStr = NSString(stringLiteral: "123456");
        print(nsStr.isEqual(to: "123456"));
        //true

2.2.3 NSString 的数值属性

        var nsStr = NSString(stringLiteral: "123456")
        print(nsStr.intValue);
        print(nsStr.floatValue);
        print(nsStr.doubleValue);

2.3 StringNSString 写法不同、功能相同的API

2.3.1 获取字符串的字符数量

        print(str.count);   //6
        print( nsStr.length);   //6

2.3.2 字符串的截取

  • String截取完成返回Substring
        var str = "123456";
        print(str.prefix(str.count - 2));   //"1234"
        print(str.suffix(3));   //"456"
        print(str.dropLast(4)); //"12"
        print(str.dropFirst(2));    //"3456"
  • NSString截取完成返回String
        var nsStr = NSString(stringLiteral: "123456");
        print(nsStr.substring(to: nsStr.length - 3))    //"123"
        print(nsStr.substring(from: 3)) //"456"
        print(nsStr.substring(with: NSMakeRange(1, 4))) //"2345"

2.3.3 添加字符到字符串结尾

  • String是添加字符到自身
        var str = "123456";
        str.append("abc");
        print(str);
        //123456abc
  • NSString是返回一个新的String,自身不变
        var nsStr = NSString(stringLiteral: "123456");
        let nsStr1 = nsStr.appending("abc");
        print(nsStr);   //123456
        print(nsStr1);  //123456abc

2.4 StringNSString 相同的API

2.4.1 是否含有特定的前缀/后缀

        var str = "123456";
        str.hasPrefix("12") //true
        str.hasSuffix("56") //true
        
        var nsStr = NSString(stringLiteral: "123456");
        nsStr.hasPrefix("12")   //true
        nsStr.hasSuffix("56")   //true

2.4.2 使用特定字符拆分字符串

        var str = "123456-11";
        str.components(separatedBy: "-");   //["123456", "11"]

        var nsStr = NSString(stringLiteral: "123456-22");
        nsStr.components(separatedBy: "-"); //["123456", "22"]

2.4.3 字母大小写转换

        var str = "abc";
        print(str.uppercased());    //ABC
        print(str.lowercased());    //abc
        
        var nsStr = NSString(stringLiteral: "cba");
        print(nsStr.uppercased);    //CBA
        print(nsStr.lowercased);    //cba

2.4.4 首字母大写

        var str = "abc";
        print(str.capitalized);    //Abc
        
        var nsStr = NSString(stringLiteral: "cba");
        print(nsStr.capitalized);    //Cba

2.4.5 去除特定字符串

  • 空格 .whitespaces
  • 换行符 .newlines
  • 数字 .decimalDigits
  • 字母 .letters
  • 大写字母 .uppercaseLetters
        let str = "\r abc ";
        let strTrimed = str.trimmingCharacters(in: .whitespacesAndNewlines)
        print(strTrimed);   //abc
        
        let nsStr = NSString(stringLiteral: "\r cba ");
        let nsStrTrimed = nsStr.trimmingCharacters(in: .whitespacesAndNewlines);
        print(nsStrTrimed); //cba

2.4.6 字符替换

  • 如果想替换的字符找不到,则返回原来字符串
        let str = "hello String";
        let str1 = str.replacingOccurrences(of: "String", with: "world")
        print(str1) //"hello world"
        
        let nsStr = NSString(stringLiteral:"hello NSString");
        let nsStr1 = nsStr.replacingOccurrences(of: "NSString", with: "world")
        print(nsStr1)   //"hello world"

2.4.7 十 \ 十六 \ 八进制数转字符串

  • 结果返回String
        let hexStr = String().appendingFormat("%x",16)//十进制转十六进制,结果为"10"
        let oStr = String().appendingFormat("%o",16)//十进制转八进制,结果为"20"
        let dStr = String().appendingFormat("%d",0x10)//十六进制转十进制,结果为"16"
        let dStr1 = String(format: "%d", 0o10)//八进制转十进制,结果为"8"
  • 结果返回NSString
        let hexNSStr = NSString().appendingFormat("%x", 16)//十进制转十六进制,结果为"10"
        let oNSStr = NSString().appendingFormat("%o",16)//十进制转八进制,结果为"20"
        let dNSStr = NSString().appendingFormat("%d",0x10)//十六进制转十进制,结果为"16"
        let dNSStr1 = NSString(format: "%d", 0o10)//八进制转十进制,结果为"8"