Swift中的 String字符串

String字符串的创建和初始化

  • 初始化空字符串
  1. 字面量
  2. 初始化器语法
  3. isEmpty 检查是否为空字符串
let emptyString = ""
let anotherEmptyString = String()

if emptyString.isEmpty {
    print("Nothing to see here")
}
  • 字面量
  1. 字符串字面量是被双引号("")包裹的固定顺序文本字符
  2. Swift 会为 str 常量推断类型为String
let str = "some string"
  • 多行字面量
  1. 多行字符串字面量是用三个双引号引起来的一系列字符
  2. 多行字符串字面量把所有行包括在引号内,开始和结束默认不会有换行符
  3. 当你代码中在多行字符串字面量里包含了换行,那个换行符同样会成为字符串里的值,如果你想要使用换行符来让你的代码易读,却不想让换行符成为字符串的值,那就在哪些行的末尾使用反斜杠()
let softWrappedQuotation = """
1. 多行字符串字面量是用三个双引号引起来的一系列字符
2. 多行字符串字面量把所有行包括在引号内,开始和结束默认\
不会有换行符
3. 当你代码中在多行字符串字面量里包含了换行,那个换行符同样会成为字符串里的值,如果你想要使用换行符来让你的代码易读,却不想让换行符成为字符串的值,那就在哪些行的末尾使用反斜杠(\\)
""" 
print(softWrappedQuotation)
  1. 要让多行字符串字面量起始或结束于换行,就在第一或最后一行写一个空行
  2. 多行字符串可以缩进以匹配周围的代码,双引号(""")前的空格会告诉 Swift 其他行钱应该有多少空白是需要忽略的
  3. 如果你在某行的空格超过了结束的双引号("""),那么这些空格会被包含
let softWrappedQuotation = """
    1. 多行字符串字面量是用三个双引号引起来的一系列字符
        2. 多行字符串字面量把所有行包括在引号内,开始和结束默认\
不会有换行符
    3. 当你代码中在多行字符串字面量里包含了换行
"""
print(softWrappedQuotation)
  • 字符串里的特殊字符
  1. 转移特殊字符\0(空字符串), \(反斜杠), \t(水平制表符), \n(换行符), \r(回车符), "(双引号), '(单引号)
  2. 任意的Unicode标量,写作\u{n},里面的n是一个1-8位的16禁止数字,起始是合法Unicode值
  3. 可以在多行字符串字面量中包含双引号(“)二不需要转移,要在多行字符串包含文本“”,转移至少一个双引号
let str = "hello\t \"Swift"
let dollarSign = "\u{24}"
let blackHeart = "\u{2665}"
let sparkingHeart = "\u{1F496}"
  • 扩展字符串分隔符(Raw String)
  1. 在字符串字面量中放置扩展分隔符,来在字符串中包含特殊字符而不让他们真的生效
  2. 把字符串放在双引号(")内并由井号(#)包裹
  3. 如果字符串里有"#则首尾需要两个##
  4. 如果你需要字符串中某个特殊符号的效果,使用匹配你包裹的#号数量的#号,并在签名写转义符号\
let str = #"Line 1\nLine 2"#
let str1 = #"Line 1\#nLine 2"#
let str2 = ###"Line 1\###nLine 2"###
print(str)
print(str1)
print(str2)

String字符串的常见操作

  • 字符串的可变性
  1. var 指定的可以修改
  2. let 指定的不可以修改
let welcome = "hello"
var welcome1 = "hello"
welcome1 += " world"
print(welcome)
print(welcome1)
  • 字符串是值类型
  1. String 值在传递给方法或者函数的时候会被复制过去
  2. 赋值给常量或者变量的时候也是一样
  3. Swift编译器优化了字符串使用的资源,实际上拷贝只会在确实需要的时候才进行
var welcome = "hello"
var welcome1 = welcome
print(welcome == welcome1)
welcome1.append(",") //Swift里面的String是值类型, welcome1改变并不会影响welcome
print(welcome)
print(welcome1)
print(welcome == welcome1)
  • 操作字符
  1. for-in 循环遍历String中的每一个独立的Character
  2. Character 类型
  3. String 值可以通过传入 Character来进行构造
for c in welcome {
    print(c)
}
  • 字符串拼接
  1. 使用加运算符(+)创建新字符串
  2. 使用加赋值符号(+=)在已经存在的 String 值末尾追加一个 String 值
  3. 使用 String 类型的 append() 方法来可以给一个 String 变量的末尾追加 Character 值
  • 字符串插值
  1. 字符串插值是一种从混合常量、变量、字面量和表达式的字符串字面量,构造新String值的方法
  2. 每一个你插入到字符串字面量的元素都要背一堆圆括号包裹,然后使用反斜杠前缀
  3. 类似于NSString 的 stringWithFormat方法,但是更加简便、更强大
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
print(message)
  1. 可以在扩展字符串分隔符中创建一个包含在其他情况下,会被当作字符串插值的字符
  2. 要在使用扩展分隔符的字符串中使用字符串插值,在反斜杠后使用匹配首尾#号
print(#"Write an interpolated string in Swift using \(multiplier)."#)
print(#"6 times 7 is \#(6 * 7)."#)

String 使用索引访问和修改字符串

  • 字符串索引
  1. 每一个String值都有相关的索引类型,String.Index,她相当于每个character在字符串中的位置
  2. startIndex 属性来访问String 中第一个Character的位置,endIndex属性就是String中最后一个字符串的位置
  3. endIndex属性并不是字符串下标脚本的合法实际参数
  4. 如果 String 为空,则starIndex 与 endIndex相等
var greeting = "Guten Tag"
print(greeting[greeting.startIndex])
print(greeting[greeting.index(before: greeting.endIndex)]) //最后一个字符
  1. 使用 index(before:) 和 index(after:) 方法来访问给定索引的前后
  2. 要访问给定索引更远的索引,可以使用 index(_:offsetBy:)
  3. 使用indices 属性来访问字符串中每一个字符的索引
print(greeting[greeting.index(before: greeting.endIndex)])
print(greeting[greeting.index(after: greeting.startIndex)])
let index = greeting.index(greeting.startIndex, offsetBy: 7)
print(greeting[index])
for c in greeting.indices {
    print(greeting[c])
}
  • 插入
  1. 插入字符,使用 insert(_:at:)方法
  2. 插入另一个字符串的内容到指定的索引,使用insert(contentsOf:at)方法
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
print(welcome)
welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))
print(welcome)
  • 删除
  1. 移除字符,使用remove(at:)方法
  2. 移除一小段特定范围的字符串,使用removeSubrange(_:)方法
welcome.remove(at: welcome.index(before: welcome.endIndex))
print(welcome)
let range = welcome.index(welcome.endIndex, offsetBy: -6)..

String 获取子字符串和进行字符串比较

  • 子字符串
  1. 使用下标或者类似 prefix(_:) 的方法得到的子字符串是 Substring 类型
  2. Substring 拥有 string 的大部分方法
  3. Substring 可以转成 string 类型
var greeting = "hello world!"
let index = greeting.firstIndex(of: "o") ?? greeting.endIndex
let beginning = greeting[..
  1. 子字符串重用一部分原字符串的内存
  2. 修改字符串或者子字符串之前都不需要花费拷贝内存的代价
  3. String 和 Substring 都遵循 StringProtocol 协议,也就是说它基本上很方便的兼容所有接受 StringProtocol 值的字符串操作函数
  • 字符串比较
  1. 字符串和字符相等性(== 和 !=)
  2. 前缀相等性 hasPrefix(_:)
  3. 后缀相等性 hasSuffix(_:)
var welcome = "hello world"
var welcome1 = "hello"
print(welcome == welcome1)
print(welcome.hasPrefix("hello"))
print(welcome.hasSuffix("world"))

你可能感兴趣的:(Swift中的 String字符串)