美文网首页
iOS开发之Swift篇(3)—— 字符串String

iOS开发之Swift篇(3)—— 字符串String

作者: 看影成痴 | 来源:发表于2019-12-20 14:37 被阅读0次

    目录

    • 版本
    • 创建
    • 可变字符串
    • 字符Character
    • 拼接
    • 索引/插入/删除
    • 截取 (子字符串)
    • 插值
    • 字符串比较
    • 字符串函数
    • 字符串运算符

    版本

    Xcode 11.0
    Swift 5.1

    创建

    两种方法创建:

    // 1. 使用字面量
    let aa = "aa"
    // 2. 通过String实例化
    let bb = String(aa)
    

    创建空字符串:

    let cc = ""
    let dd = String()
    

    多行字符串:

    // 单行写法
    let ee1 = "line1\nline2"
    
    // 多行写法
    let ee2 = """
    line1
    line2
    """
    

    缩进. 从关闭引号(""")所在位置开始算每行的缩进, line1这行会被缩进

    let ee3 = """
                line1
            line2
            """
    

    续行符 (\).

    let ee4 = """
    line1_1 \
    line1_2
    """
    // 实际打印出一行 line1_1 line1_2
    

    可变字符串

    在 Objective-C 和 Cocoa 中,需要通过选择两个不同的类(NSString 和 NSMutableString)来指定字符串是否可以被修改。
    Swift中, 常量不可被修改, 变量可修改.
    可变字符串, 即使用var修饰字符串.

    // 可变字符串
    var ff = "修改前"
    ff = "修改后"
    print(ff)    // 打印 修改后
    

    字符Character

    // 创建字符
    let aChar:Character = "!"
    print(aChar)
    
    // 使用字符数组创建字符串
    let chars: [Character] = ["A", "p", "p", "l", "e"]
    let str = String(chars)
    print(str)
    
    // 遍历字符串, 获取每一个字符的值
    for character in "Dog!🐶" {
        print(character)
    }
    // D
    // o
    // g
    // !
    // 🐶
    

    拼接

    // 两个字符串直接相加
    let gg = "gg"
    let hh = "hh"
    var ii = gg + hh
    print(ii)    // 打印 gghh
    
    // 字符串尾追加字符
    let aChar: Character = "!"
    ii.append(aChar)
    print(ii)    // 打印 gghh!
    

    索引/插入/删除

    1. 索引
    OC中, 字符串的索引是整数, 可以如下操作:

    // 提取字符串:单个,指定位到末尾,开头至指定位置,指定区间
    unichar aChar = [str1 characterAtIndex:5];
    NSString *str4 = [str1 substringFromIndex:5];
    NSString *str5 = [str1 substringToIndex:5];
    NSString *str6 = [str1 substringWithRange:NSMakeRange(2, 4)];
    

    Swift中, 字符串的索引不是整数, 而是一个索引类型String.Index。
    使用 startIndex 属性可以获取一个 String 的第一个 Character 的索引。使用 endIndex 属性可以获取最后一个 Character 的后一个位置的索引。因此,endIndex 属性不能作为一个字符串的有效下标。如果 String 是空串,startIndex 和 endIndex 是相等的。

    let str = "Hello, world"
    let startIndex = str.startIndex
    let endIndex = str.endIndex
    print(startIndex)    // Index(_rawBits: 1)
    print(endIndex)      // Index(_rawBits: 786433)
    

    通过调用 String 的 index(before:) 或 index(after:) 方法,可以立即得到前面或后面的一个索引。
    也可以通过调用 index(_:offsetBy:) 方法来获取对应偏移量的索引。
    还可以通过调用 firstIndex(of:) 方法来获取某个字符第一次出现所对应的索引值

    let str = "Hello, world"
    let startIndex = str.startIndex
    let endIndex = str.endIndex
    
    // 第二个字符索引
    let secondIndex = str.index(after: startIndex)
    // 最后一个字符索引
    let lastIndex = str.index(before: endIndex)
    // 从某一索引往前/后偏移(注意偏移值可正可负)多少位所对应的索引 
    let customIndex = str.index(startIndex, offsetBy: 5)
    // 某一个字符在字符串中的索引
    let rIndex = str.firstIndex(of: "r")    // 返回可选类型
    
    // 打印索引对应的字符
    print(str[startIndex])          // H
    print(str[secondIndex])         // e
    print(str[lastIndex])           // d
    print(str[customIndex])         // ,
    if rIndex != nil {
        print(str[rIndex!])         // r
    }
    

    遍历索引值:

    // 遍历索引值
    for index in str.indices {
       print("\(str[index])", terminator: "")  // 不换行打印
    }
    // 打印输出 Hello, world
    

    2. 插入

    // 插入字符
    var welcome = "hello"
    welcome.insert("!", at: welcome.endIndex)
    // welcome 变量现在等于 "hello!"
    
    // 插入字符串
    welcome.insert(contentsOf:" there", at: welcome.index(before: welcome.endIndex))
    // welcome 变量现在等于 "hello there!"
    

    3. 删除

    // 删除字符
    welcome.remove(at: welcome.index(before: welcome.endIndex))
    // welcome 现在等于 "hello there"
    
    // 删除字符串
    let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
    welcome.removeSubrange(range)
    // welcome 现在等于 "hello"
    

    截取 (子字符串)

    在前面索引小节中, 我们知道使用数组下标方式可以获取某个index对应的字符:

    let str = "Hello, world"
    print(str[str.startIndex])    // H
    

    其实也可以使用这种方式来获取字符串.
    但是注意, 此时获取到的字符串属于 SubString 类型. Swift 里的 SubString 绝大部分函数都跟 String 一样,意味着你可以使用同样的方式去操作 SubString 和 String。然而, SubString 重用了原 String 的内存空间, 这意味着, 只有在短时间内需要操作字符串时才使用SubString.
    为了不给自己找麻烦, 干脆把获取到的SubString直接生成一个新的可全局使用的String比较稳妥:

    let str = "Hello, world"
    let customIndex = str.index(str.endIndex, offsetBy: -5)
    let endIndex = str.endIndex
    let tempStr = str[customIndex..<endIndex]    // 返回 SubString 类型实例
    print(tempStr)    // 打印输出 world
    
    // 把SubString转化为 String 以便长期存储。
    let newStr = String(tempStr)
    

    除了使用数组下标方式, Swift还提供了两种方式来获取字符串的开头部分和结尾部分:

    // 获取字符串的前5个字符
    let tempStr2 = str.prefix(5)
    let newStr2 = String(tempStr2)
    
    // 获取字符串的后5个字符
    let tempStr3 = str.suffix(5)
    let newStr3 = String(tempStr3)
    

    插值

    字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。 你插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中:

    // 插值
    var varA   = 20
    let constA = 100
    var varC:Float = 20.0
    
    var stringA = "\(varA) 乘于 \(constA) 等于 \(varC * 100)"
    print( stringA )
    // 20 乘于 100 等于 2000.0
    

    字符串比较

    // 相等
    let aa = "Hello"
    let bb = "Hello"
    if aa == bb {
        print("aa等于bb")
    }
    
    // 前缀/后缀
    let cc: String = "Hello, world"
    if cc.hasPrefix("He") {
        print("有前缀He")
    }
    if cc.hasSuffix("ld") {
        print("有后缀ld")
    }
    
    // 包含字符
    if cc.contains("r") {
        print("包含字符r")
    }
    // 包含字符串 (要导入Foundation)
    import Foundation
    if cc.contains("llo") {
        print("包含字符串llo")
    }
    

    字符串函数

    isEmpty
    判断字符串是否为空,返回布尔值
    
        
    hasPrefix(prefix: String)
    检查字符串是否拥有特定前缀
    
        
    hasSuffix(suffix: String)
    检查字符串是否拥有特定后缀
    
        
    Int(String)
    转换字符串数字为整型
    
        
    String.count
    计算字符串的长度 (Swift 3 版本使用的是 String.characters.count)
    
    utf8
    UTF-8 编码
    
    utf16
    utf16 编码
    
    unicodeScalars
    Unicode 标量编码
    

    字符串运算符

    +
    连接两个字符串,并返回一个新的字符串
    
    +=
    连接操作符两边的字符串并将新字符串赋值给左边的操作符变量
    
    ==
    判断两个字符串是否相等
    
    <
    比较两个字符串,对两个字符串的字母逐一比较
    
    !=
    比较两个字符串是否不相等
    

    相关文章

      网友评论

          本文标题:iOS开发之Swift篇(3)—— 字符串String

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