Swift-String常用功能

一、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時,纔會開闢新的存儲空間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章