1. 初始化
字符串字面值:
let someString = "Some string literal value"
空字符串:
let emptyString = ""
let anotherEmptyString = String()
if emptyString.isEmpty { // nil 跟 "" 是两个不同的问题,因为 emptyString 和 anotherEmptyString 都是 string 类型而不是 string? 类型,所以这里不可能为 nil
print("Nothing to see here")
}
2. Swift String 是值类型
Swift String 与 NSString 最本质的区别在于:Swift String 是值类型。这意味着,共同持有 NSMutableString 变量的设计将不得不被放弃。因为 Swift String 是值类型,所以 Swift 没有与 NSMutableString 对应的类型,你只能通过 var 和 let 来声明变量和常量。
字符串变量:
var variableString = "Horse"
var anotherVariableString = variableString
variableString += " and carriage"
print(variableString) // 变成了 "Horse and carriage"
print(anotherVariableString) // 仍然是 "Horse"
字符串常量:
let constantString = "Highlander"
constantString += " and another Highlander" // 编译器警告错误:常量不能被修改。注释掉这一行,或者把 let 改为 var, 才能通过编译
3. Character(字符)
Character 是一个单独的类型,用来表示一个单独的字符。另外,字符数组与字符串是两种不同的类型,不过你可以访问 string 的 characters 属性来遍历它所对应的字符数组。
字符数组:
for character in "Dog!".characters {
print(character)
}
// D
// o
// g
// !
字符:
let exclamationMark: Character = "!"
字符数组 转化为 字符串
let catCharacters: [Character] = ["C", "a", "t", "!"]
let catString = String(catCharacters)
print(catString) // "Cat!"
4. 字符串拼接
String 使用 +
拼接另一个 String :
let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
print(welcome) // "hello there"
String 使用 +=
拼接另一个 String :
var instruction = "look over"
instruction += string2
print(instruction) // "look over there"
String 通过 append() 方法拼接一个 Character:
let exclamationMark: Character = "!"
welcome.append(exclamationMark)
print(welcome) // "hello there!"
注: Character 没法拼接 String,因为 Character 只能包含一个字符。
5. 字符串内插
使用 \()
把 String 内插到字面值中:
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
print(message) // "3 times 2.5 is 7.5"
6. 求字符串长度
Swift 2.2 移除了 countElemtents
方法,现在只能够通过求 String 所对应的字符数组的长度,来求 String 的长度。
let aString = "This is a string."
let count = aString.characters.count
print(count) // 17
7. 访问和修改字符串
String 支持下标操作。
7.1 字符串索引
Index(索引) 是 String 的关联类型,用来定位 String 中的每一个 Character。你可以通过 startIndex
、endIndex
两个属性来获得 String 中第一个字符的 Index 和最后一个字符往后一个 Index。
let greeting = "Guten Tag!"
print(greeting[greeting.startIndex]) // "G"
print(greeting[greeting.endIndex.predecessor()]) // "!"
print(greeting[greeting.startIndex.successor()]) // "u"
let index = greeting.startIndex.advancedBy(7)
print(greeting[index]) // "a"
因为 endIndex
获取的是 String 最后一个字符往后一个 Index,所以直接访问 String 的 endIndex
程序会在运行时发生崩溃。而访问 endIndex
的 successor
方法也会发生崩溃:
print(greeting[greeting.endIndex]) // 能通过编译,运行时崩溃
greeting.endIndex.successor() // 能通过编译,运行时崩溃
对于空字符串来说,
startIndex
与endIndex
相等,都等于 0。否则,endIndex
应该大于startIndex
.
7.2 插入与删除
String 的插入与删除操作都是以 Character 为单位进行的。
插入单个字符:
var welcome = "hello"
welcome.insert("!", atIndex: welcome.endIndex)
print(welcome) // "hello!"
插入字符数组:
welcome.insertContentsOf(" there".characters, at: welcome.endIndex.predecessor())
print(welcome) // "hello there!"
删除单个字符:
welcome.removeAtIndex(welcome.endIndex.predecessor())
print(welcome) // "hello there"
删除一串字符:
let range = welcome.endIndex.advancedBy(-6)..
8. 比较
因为 String 是值类型,所以只支持 ==
和 !=
操作。
8.1 相等
字符串相等:
let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
print("These tow strings are considered equal")
}
// "These tow strings are considered equal"
因为
==
是值相等,所以两个字符串即使用不同的 Unicode 字面值,但是只要内容是一样的,值就是相等的。
let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"
print(eAcuteQuestion) // "Voulez-vous un café?"
let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"
print(combinedEAcuteQuestion) // "Voulez-vous un café?"
if eAcuteQuestion == combinedEAcuteQuestion {
print("These tow strings are considered equal")
}
// "These tow strings are considered equal"
字符相等:
let latinCapitalLetterA: Character = "\u{41}"
print(latinCapitalLetterA) // "A"
let cyrillicCapitalLetterA: Character = "\u{0410}"
print(cyrillicCapitalLetterA) // 看起来也是 "A",但实际上是俄文字符
if latinCapitalLetterA != cyrillicCapitalLetterA {
print("These two characters are not equivalent")
}
// "These two characters are not equivalent"
8.2 前缀、后缀
前缀:
let 中文字符串 = "我爱北京天安门"
if 中文字符串.hasPrefix("我爱") {
print("前缀是我爱")
}
// 前缀是我爱
后缀:
if 中文字符串.hasSuffix("天安门") {
print("后缀是天安门")
}
// 后缀是天安门