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时,才会开辟新的存储空间。

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