Swift-String常用功能

作者: Sweet丶 | 来源:发表于2023-01-01 22:48 被阅读0次
    一、String与OC字符串转换

    Swift中的String使用方法跟OC有很大的不同,先介绍一下String和OC字符串的转换方式,有时为了方便可以转为OC的字符串来使用。

    func testStrTransform() {
        // 1. NSString和String的转换,使用as
        let str: String = "String"
        let str2: NSString = "NSString"
        let str3 = str as NSString // NSString
        let str4 = str2 as String
        print(str3, str4)//String NSString
        
        /* 2. NSMutableString转换为String,用as;但String不能as转为NSMutableString。
         * NSMutableString是NSString的子类,NSString可以转换String,所以NSMutableString也可以;
         * 但是String不能转为NSString的子类NSMutableString去使用。
         */
        let mutStr = NSMutableString(string: "NSMutableString")
        let mutStr2 = mutStr as String // NSMutableString修改了,String不会跟着改
    //    let mutStr3 = mutStr2 as NSMutableString// 编译报错
        mutStr.append("--append")
        print(mutStr, mutStr2)//NSMutableString--append NSMutableString
        
        // 3. String要变为NSMutableString,需要调用初始化方法。
        let strToMut = "String"
        let strToMut2 = NSMutableString(string: strToMut)
        // 调用as?转换结果是nil,因为转换不会成功。所以strToMut3的结果是默认值
        let strToMut3: NSMutableString = strToMut as? NSMutableString ?? "默认值"
        strToMut3.append("--apend")
        print(strToMut, strToMut2, strToMut3)
    }
    
    二、String中的Index、Range

    String遵守了BidirectionalCollection协议, 协议中有startIndexendIndex之类跟索引相关的属性、方法。在String中索引的类型是特有的String.Index, 我们应该将它当做一个特别的索引类型,不能当做是Int来使用。

    func testStrIndex() {
        // 一、字符串索引
        let str = "abcdefg"
        let start = str.startIndex
        let end = str.endIndex // str[end]会奔溃,因为end已经是最后一个
        let start1 = str.index(after: start)
        let start2 = str.index(start, offsetBy: 2)// start之后的第2个元素索引
        let end1 = str.index(before: end)// str[end1]取出的是最后一个字符
        let end2 = str.index(end, offsetBy: -2)// str[end2]取出的是倒数第2个字符
        // 1.通过索引来取出对应位置的字符,Character
        let aaa = str[start1]
        print(str[start] ,str[start1], str[start2], str[end1], str[end2], "-----")
         
        // 2.可通过last和first来取首尾字符,不会出现越界奔溃
        print(str.last, str.first)
    }
    

    String中可以通过索引来定义区间Range,然后通过区间来取子串。

        // 1.两个字符串的Index来初始化一个区间Range
        let range = start..<end
        // 2.通过range从字符串中取出一个子串,str[range]是String.SubSequence类型
        print(str[range], "-----")
    
    三、String中增加、插入、删除

    String遵守了RangeReplaceableCollection协议,实现了appendinsertdelete之类方法。

    func testStrRangeReplaceable() {
        // 1.append追加字符串
        var greeting = "Hello, " // 需要是可变字符串
        greeting.append("friend")
        print(greeting) // Hello, friend
        
        // 2.insert插入字符串
        // 插入一个字符Character类型
        greeting.insert("x", at: greeting.index(greeting.startIndex, offsetBy: 6))
        print(greeting)
        // 插入一个字符串
        greeting.insert(contentsOf: "-chinese", at: greeting.index(greeting.startIndex, offsetBy: 7))
        print(greeting)// Hello,x-chinese friend
        
        // 3.replaceSubrange替换range中的字符串
        let index1 = greeting.index(greeting.startIndex, offsetBy: 6)
        let index2 = greeting.index(greeting.startIndex, offsetBy: 15)
        greeting.replaceSubrange(index1..<index2, with: "iran")
        print(greeting)// Hello,iran friend
        
        // 4.remove来移除部分元素
        // 移除所有的"r"字符
        greeting.removeAll { chracter in
            chracter == "r"
        }
        print(greeting)// Hello,ian fiend
        greeting.removeFirst() // 移除第一个字符
        print(greeting)// ello,ian fiend
        greeting.removeFirst(3) // 移除前3个字符
        print(greeting) // o,ian fiend
    //    greeting.removeLast()// 移除最后一个字符
        
        // 移除一个范围内的字符串
        let index11 = greeting.index(greeting.startIndex, offsetBy: 2)
        let index22 = greeting.index(greeting.startIndex, offsetBy: 4)
        greeting.removeSubrange(index11..<index22)
        print(greeting) // o,n fiend
    }
    
    四、String的子串SubString

    我们通过prefixsuffixstr[range]获取到的子字符串类型是Substring.

    func testSubstring() {
        
        var str = "1_2_3_4_5"
        // 下面方式取的字符串都是Substring类型
        // 取出前3个字符
        var subStr1 = str.prefix(3) // 1_2
        var subStr2 = str.suffix(3) // 4_5
        
        var range = str.startIndex..<(str.index(str.startIndex, offsetBy: 3))
        var subStr3 = str[range] // "1_2"
        
        // SubString都有一个base,指向最初的字符串
        print(subStr3.base) //1_2_3_4_5
        
        // SubString转为String
        var str2 = String(subStr3)//"1_2"
    }
    

    Substring类型和它的base原始字符串是共享一段内存的,Substring只是指向了base的一段内存;当Substring转为String时,才会开辟新的存储空间。

    Substring指向的是String中的一段.png

    相关文章

      网友评论

        本文标题:Swift-String常用功能

        本文链接:https://www.haomeiwen.com/subject/hcfyqdtx.html