Swift String(字符串) (Swift 2.2)

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。你可以通过 startIndexendIndex 两个属性来获得 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 程序会在运行时发生崩溃。而访问 endIndexsuccessor 方法也会发生崩溃:

print(greeting[greeting.endIndex]) // 能通过编译,运行时崩溃
greeting.endIndex.successor() // 能通过编译,运行时崩溃

对于空字符串来说, startIndexendIndex 相等,都等于 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("后缀是天安门")
}
// 后缀是天安门

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