String

作者: 纳兰沫 | 来源:发表于2019-09-25 17:17 被阅读0次

    String的插入和删除

    var str = "1_2"
    str.insert("_", at: str.endIndex)
    print(str,str.count,str.startIndex,str.endIndex)
    str.insert("_", at: str.startIndex)
    print(str,str.count,str.startIndex,str.endIndex)
    
    str.insert(contentsOf: "3_4", at: str.startIndex)
    print(str,str.count,str.startIndex,str.endIndex)
    
    str.insert(contentsOf: "666", at: str.index(after: str.startIndex))
    print(str,str.count,str.startIndex,str.endIndex)
    
    str.insert(contentsOf: "888", at: str.index(before: str.endIndex))
    print(str,str.count,str.startIndex,str.endIndex)
    
    str.insert(contentsOf: "hello", at: str.index(str.startIndex, offsetBy: 4))
    print(str,str.count,str.startIndex,str.endIndex)
    
    1_2_ 4 Index(_rawBits: 0) Index(_rawBits: 262144)
    _1_2_ 5 Index(_rawBits: 0) Index(_rawBits: 327680)
    3_4_1_2_ 8 Index(_rawBits: 0) Index(_rawBits: 524288)
    3666_4_1_2_ 11 Index(_rawBits: 0) Index(_rawBits: 720896)
    3666_4_1_2888_ 14 Index(_rawBits: 0) Index(_rawBits: 917504)
    3666hello_4_1_2888_ 19 Index(_rawBits: 0) Index(_rawBits: 1245184)
    
    str.remove(at: str.firstIndex(of: "1")!)
    print(str,str.count,str.startIndex,str.endIndex)
    
    //删除是6的字符
    str.removeAll { $0 == "6"
    }
    print(str,str.count,str.startIndex,str.endIndex)
    
    //删除区间
    var range = str.index(str.endIndex, offsetBy: -4) ..< str.index(before: str.endIndex)
    str.removeSubrange(range)
    print(str,str.count,str.startIndex,str.endIndex)
    
    3666hello_4__2888_ 18 Index(_rawBits: 0) Index(_rawBits: 1179648)
    3hello_4__2888_ 15 Index(_rawBits: 0) Index(_rawBits: 983040)
    3hello_4__2_ 12 Index(_rawBits: 0) Index(_rawBits: 786432)
    

    SubString

    String可通过下标 prefix suffix等截取子串 子串类型不是String 是SubString

    var subStr1 = str.prefix(3)
    print(subStr1)
    
    var subStr2 = str.suffix(3)
    print(subStr2)
    
    var range = str.startIndex ..< str.index(str.startIndex, offsetBy: 4)
    var subStr3 = str[range]
    print(subStr3)
    
    //最初的String
    print(subStr3.base)
    
    //SubString -> String
    var str2 = String(subStr3)
    

    SubString 和 String公用一份内存 只不过SubString 的指针有区域指向对应的位置,但是如果对SubString 进行 String转换 那么就会生成一份新的内存存放SubString里面的内容
    如果对SubString 进行append操作 那么SubString 会产生一份新的内存存放内容 不会影响到原先的String

    var str = "123456"
    var range = str.startIndex ..< str.index(str.startIndex, offsetBy: 4)
    var subStr3 = str[range]
    print(subStr3)
    
    
    subStr3.append(contentsOf: "dasa")
    print(str)
    
    123456
    

    SubString发生修改 或者 转为String时 会分配新的内存存储字符串数据

    String 和 Character

    for c in "jack" {
        print(c)
    }
    
    var str = "jack"
    var c = str[str.startIndex]
    

    c是character类型

    String相关的协议

    BidirectionalCollection 协议包含的部分内容
    - startIndex  endIndex 属性 index方法
    - String Array都遵守这个协议
    
    RangeReplaceableCollection 协议包含的部分内容
    - append   insert  remove方法
    - String Array都遵守了这个协议
    

    Dictionary set 也有实现上述方法 只不过没有遵守协议

    多行String

    let str = """
    1
        "2"
    3
        "4"
    """
    print(str)
    
    1
        "2"
    3
        "4"
    

    缩进以最后的3引号为标准

    String 和 NSString

    1.String 和 NSString之间可以随时随地桥接转换
    2.String 不能 桥接转换成 NSMutableString 说的是直接转换 也就是使用as方法,但是 如果是使用NSMutableString(string: str)这样的方法是可以实现String 转换成 NSMutableString的

    比较字符串内容是否等价
    1.String使用==运算符
    2.NSString使用isEqual方法 也可以使用==运算符 (本质还是调用了isEqual方法)
    
    Swift OC桥接转换表.png

    相关文章

      网友评论

          本文标题:String

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