String字符串的创建和初始化
- 字面量
- 初始化器语法
- isEmpty 检查是否为空字符串
let emptyString = ""
let anotherEmptyString = String()
if emptyString.isEmpty {
print("Nothing to see here")
}
- 字符串字面量是被双引号("")包裹的固定顺序文本字符
- Swift 会为 str 常量推断类型为String
let str = "some string"
- 多行字符串字面量是用三个双引号引起来的一系列字符
- 多行字符串字面量把所有行包括在引号内,开始和结束默认不会有换行符
- 当你代码中在多行字符串字面量里包含了换行,那个换行符同样会成为字符串里的值,如果你想要使用换行符来让你的代码易读,却不想让换行符成为字符串的值,那就在哪些行的末尾使用反斜杠()
let softWrappedQuotation = """
1. 多行字符串字面量是用三个双引号引起来的一系列字符
2. 多行字符串字面量把所有行包括在引号内,开始和结束默认\
不会有换行符
3. 当你代码中在多行字符串字面量里包含了换行,那个换行符同样会成为字符串里的值,如果你想要使用换行符来让你的代码易读,却不想让换行符成为字符串的值,那就在哪些行的末尾使用反斜杠(\\)
"""
print(softWrappedQuotation)
- 要让多行字符串字面量起始或结束于换行,就在第一或最后一行写一个空行
- 多行字符串可以缩进以匹配周围的代码,双引号(""")前的空格会告诉 Swift 其他行钱应该有多少空白是需要忽略的
- 如果你在某行的空格超过了结束的双引号("""),那么这些空格会被包含
let softWrappedQuotation = """
1. 多行字符串字面量是用三个双引号引起来的一系列字符
2. 多行字符串字面量把所有行包括在引号内,开始和结束默认\
不会有换行符
3. 当你代码中在多行字符串字面量里包含了换行
"""
print(softWrappedQuotation)
- 转移特殊字符\0(空字符串), \(反斜杠), \t(水平制表符), \n(换行符), \r(回车符), "(双引号), '(单引号)
- 任意的Unicode标量,写作\u{n},里面的n是一个1-8位的16禁止数字,起始是合法Unicode值
- 可以在多行字符串字面量中包含双引号(“)二不需要转移,要在多行字符串包含文本“”,转移至少一个双引号
let str = "hello\t \"Swift"
let dollarSign = "\u{24}"
let blackHeart = "\u{2665}"
let sparkingHeart = "\u{1F496}"
- 在字符串字面量中放置扩展分隔符,来在字符串中包含特殊字符而不让他们真的生效
- 把字符串放在双引号(")内并由井号(#)包裹
- 如果字符串里有"#则首尾需要两个##
- 如果你需要字符串中某个特殊符号的效果,使用匹配你包裹的#号数量的#号,并在签名写转义符号\
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字符串的常见操作
- var 指定的可以修改
- let 指定的不可以修改
let welcome = "hello"
var welcome1 = "hello"
welcome1 += " world"
print(welcome)
print(welcome1)
- String 值在传递给方法或者函数的时候会被复制过去
- 赋值给常量或者变量的时候也是一样
- Swift编译器优化了字符串使用的资源,实际上拷贝只会在确实需要的时候才进行
var welcome = "hello"
var welcome1 = welcome
print(welcome == welcome1)
welcome1.append(",") //Swift里面的String是值类型, welcome1改变并不会影响welcome
print(welcome)
print(welcome1)
print(welcome == welcome1)
- for-in 循环遍历String中的每一个独立的Character
- Character 类型
- String 值可以通过传入 Character来进行构造
for c in welcome {
print(c)
}
- 使用加运算符(+)创建新字符串
- 使用加赋值符号(+=)在已经存在的 String 值末尾追加一个 String 值
- 使用 String 类型的 append() 方法来可以给一个 String 变量的末尾追加 Character 值
- 字符串插值是一种从混合常量、变量、字面量和表达式的字符串字面量,构造新String值的方法
- 每一个你插入到字符串字面量的元素都要背一堆圆括号包裹,然后使用反斜杠前缀
- 类似于NSString 的 stringWithFormat方法,但是更加简便、更强大
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
print(message)
- 可以在扩展字符串分隔符中创建一个包含在其他情况下,会被当作字符串插值的字符
- 要在使用扩展分隔符的字符串中使用字符串插值,在反斜杠后使用匹配首尾#号
print(#"Write an interpolated string in Swift using \(multiplier)."#)
print(#"6 times 7 is \#(6 * 7)."#)
String 使用索引访问和修改字符串
- 每一个String值都有相关的索引类型,String.Index,她相当于每个character在字符串中的位置
- startIndex 属性来访问String 中第一个Character的位置,endIndex属性就是String中最后一个字符串的位置
- endIndex属性并不是字符串下标脚本的合法实际参数
- 如果 String 为空,则starIndex 与 endIndex相等
var greeting = "Guten Tag"
print(greeting[greeting.startIndex])
print(greeting[greeting.index(before: greeting.endIndex)]) //最后一个字符
- 使用 index(before:) 和 index(after:) 方法来访问给定索引的前后
- 要访问给定索引更远的索引,可以使用 index(_:offsetBy:)
- 使用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])
}
- 插入字符,使用 insert(_:at:)方法
- 插入另一个字符串的内容到指定的索引,使用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)
- 移除字符,使用remove(at:)方法
- 移除一小段特定范围的字符串,使用removeSubrange(_:)方法
welcome.remove(at: welcome.index(before: welcome.endIndex))
print(welcome)
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
print(welcome)
String 获取子字符串和进行字符串比较
- 使用下标或者类似 prefix(_:) 的方法得到的子字符串是 Substring 类型
- Substring 拥有 string 的大部分方法
- Substring 可以转成 string 类型
var greeting = "hello world!"
let index = greeting.firstIndex(of: "o") ?? greeting.endIndex
let beginning = greeting[..<index]
print(String(beginning))
- 子字符串重用一部分原字符串的内存
- 修改字符串或者子字符串之前都不需要花费拷贝内存的代价
- String 和 Substring 都遵循 StringProtocol 协议,也就是说它基本上很方便的兼容所有接受 StringProtocol 值的字符串操作函数
- 字符串和字符相等性(== 和 !=)
- 前缀相等性 hasPrefix(_:)
- 后缀相等性 hasSuffix(_:)
var welcome = "hello world"
var welcome1 = "hello"
print(welcome == welcome1)
print(welcome.hasPrefix("hello"))
print(welcome.hasSuffix("world"))
网友评论