//字符串是一串字符,swift里的字符串是String类型
//字符串级联用+操作符将两个字符串关联起来
3.0字符串--String Literals
//用""声明一个字符串
let someString = "Some string literal value"
//swift推断someString为String类型,因为他被初始化"Some string literal value"
3.1初始化一个空字符串
//创建空字符串有两种方式:
var emptyString = ""// empty string literal
var anotherEmptyString = String()// initializer syntax
//这连个变量都是空字符串
//检查一个字符串是否为空,可以通过他的布尔属性isEmpty来判断
if emptyString.isEmpty {
// print("Nothing to see here")
}// prints "Nothing to see here"
3.2可变字符串--String Mutability
//你可以定义一个字符串变量,字符串可以被修改,或者定义一个字符串常量,字符串不可以被修改
var variableString = "Horse"
variableString += " and carriage"
// variableString is now "Horse and carriage"
//let constantString = "Highlander"
//constantString += " and another Highlander"
this reports a compile-time error - a constant string cannot be modified
//这是不同于oc里的字符串,你可以的定义一个NSMutableString来表明字符串可以被修改
3.3字符串是值类型--Strings Are Value Types
//swift的String类型是一个值类型,如果你定义一个字符串,那么字符串可以不复制当他被传递给方法或者函数的时候,或者当分配一个常量或者变量的时候,新的复制值可以被传递,不在是原来的值
3.4字符--Working with Characters
//通过for循环使用字符串的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)
// prints "Cat!?"
3.5连接字符串和字符
let str1 = "hello"
let str2 = " there"
var welcome = str1 + str2
// welcome now equals "hello there"
//你也可以这样做:
var instruction = "look over"
instruction += str2
// instruction now equals "look over there"
//你也可以连接一个字符通过String类型的append()方法
//let exclamationMark: Character = "!"
//welcome.append(exclamationMark)
// welcome now equals "hello there!"
//说明:你不可以将一个字符串或者字符连接到一个字符的后面,因为字符仅仅有一个
3.6字符串插值--String Interpolation
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier)*2.5)"
// message is "3 times 2.5 is 7.5"
//说明:括号里的插值不能包括\和换行符
3.7统一码--Unicode
//Unicode是一种国际标准,主要用在不同写系统中的文本的编码,处理,他能够使你展现任何语言的字符,
//统一码标量--Unicode Scalars
//Swift的String类型被编译为Unicode Scalars值,一个Unicode Scalars是一个独特的21位数字,比如: U+0061代表LATIN SMALL LETTER A ("a"),U+1F425代表FRONT-FACING BABY CHICK ("?")
//A Unicode scalar范围是 U+0000 到 U+D7FF,或者 U+E000 to U+10FFFF,不包括 U+D800 to U+DFFF
//特别的字符
// \0(空字符),\\ (反斜杠),\t (水平制表),\n (换行),\" (双引), \' (单引),\r (carriage return)
//任何一个Unicode scalar,表达式:\u{n},n是1到8位的十六进制数
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign = "\u{24}" // $, Unicode scalar U+0024
//print(dollarSign)
let blackHeart = "\u{2665}" // ♥, Unicode scalar U+2665
//print(blackHeart)
let sparklingHeart = "\u{1F496}" // ?, Unicode scalar U+1F496
3.8统计字符--Counting Characters
//检索字符串中字符的个数,用String的characters的count属性
let unusualMenagerie = "Koala ?, Snail ?, Penguin ?, Dromedary ?"
//print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")
// prints "unusualMenagerie has 40 characters"
//说明,字符串级联不影响字符串中字符串的个数,
//比如字符串"cafe"有四个字符,连接一个é,结果字符串任然有四个字符,最后一个字符是 é, not e
var word = "cafe"
//print ("the number of characters in \(word) is \(word.characters.count)")
// prints "the number of characters in cafe is 4"
word += "\u{301}"// COMBINING ACUTE ACCENT, U+0301
//print("the number of characters in \(word) is \(word.characters.count)")
// prints "the number of characters in café is 4"
3.9访问和修改字符串--Accessing and Modifying a String
//你可以通过字符串的方法或者属性或者点语法来修改字符串
//字符串索引
//每一个字符串都有一个相关的索引类型String.Index,它对应了字符串中每一个字符的位置
//正如上面提到的一样,不同的字符要求不同内存来存储,因此为了确定字符在字符串中的位置,因此你一定要从字符串的开始到结束迭代出每一个编码标量,基于这个原因,swift的字符串不可能被整型数值索引
//使用startIndex属性来获取字符串中第一个字符的位置,endIndex属性是字符串中最后一个字符的下一个位置,结果,对于一个字符串的下标来说,endIndex是一个非法的参数
//如果字符串为空,startIndex和endIndex相等
//通过调用predecessor()方法,可以立马获得String.Index的前一个索引;调用successor()这个方法,可以获得String.Index的下一个索引;调用advancedBy(_:)方法可以获得字符串中的任意一个索引
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(2)
//print(index)
//print(greeting[index])
//t
//尝试获得字符串之外的字符会报错,
//greeting[greeting.endIndex]//报错
//greeting.endIndex.successor()//报错
//通过characters属性的indices属性可以获得所有索引的集合,
for index in greeting.characters.indices {
// print("\(greeting[index])",terminator: "")
// print(greeting[index])
}
//插入和删除字符
//使用insert(_:atIndex:)方法来插入字符
var welcomes = "hello"
welcomes.insert("!", atIndex: welcomes.endIndex)
//print(welcomes)
// welcome now equals "hello!"
//使用insertContentsOf(_:at:)方法来插入字符串
welcomes.insertContentsOf(" there".characters, at: welcomes.endIndex.predecessor())
//print(welcomes)
//使用removeAtIndex(_:)方法来删除字符
welcomes.removeAtIndex(welcomes.endIndex.predecessor())
//print(welcomes)
// welcome now equals "hello there"
//使用removeRange(_:)方法来移除子字符串
let range = welcomes.endIndex.advancedBy(-6)..<welcomes.endIndex
welcomes.removeRange(range)
//print(welcomes)
// welcome now equals "hello"
3.10字符串比较--Comparing Strings
//swift提供了三种方法来比较文本:字符串和字符比较,字符串开头比较,字符串结尾比较
//字符串和字符比较使用操作符==(相等)和!=(不等)
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 two strings are considered equal")
}
// prints "These two strings are considered equal"
//如果两个字符串或者字符的扩展字形集群相等,那么这两个字符串或者字符就是想等的,如果它们有相同的语言意思,那么扩展字形集群就是相等的,
//使用hasPrefix(_:)方法和hasSuffix(_:)方法,可以判断字符串是否以某个字符串开头或者结尾,参数都是String类型,返回值是Bool类型
let romeoAndJuliet = [
"Act 1 Scene 1: Verona, A public place",
"Act 1 Scene 2: Capulet's mansion",
"Act 1 Scene 3: A room in Capulet's mansion",
"Act 1 Scene 4: A street outside Capulet's mansion",
"Act 1 Scene 5: The Great Hall in Capulet's mansion",
"Act 2 Scene 1: Outside Capulet's mansion",
"Act 2 Scene 2: Capulet's orchard",
"Act 2 Scene 3: Outside Friar Lawrence's cell",
"Act 2 Scene 4: A street in Verona",
"Act 2 Scene 5: Capulet's mansion",
"Act 2 Scene 6: Friar Lawrence's cell"
]
var act1SceneCount = 0
for sence in romeoAndJuliet {
if sence.hasPrefix("Act 1 ") {
++act1SceneCount
}
}
//print("There are \(act1SceneCount) sences in Act 1")
// prints "There are 5 scenes in Act 1"
//类似的可以用 hasSuffix(_:) 来判断是否已某个字符串结尾
var mansionCount = 0
var cellCount = 0
for sence in romeoAndJuliet {
if sence.hasSuffix("Capulet's mansion") {
++mansionCount
}else if sence.hasSuffix("Friar Lawrence's cell") {
++cellCount
}
}
//print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
// prints "6 mansion scenes; 2 cell scenes"
3.11字符串的统一码代表--Unicode Representations of Strings
let dogString = "Dog!!?"
//UTF-8 Representation
//使用字符串的utf8属性迭代获得UTF-8 Representation
for codeUnit in dogString.utf8 {
// print("\(codeUnit) ", terminator: "")
}
//print("")
// 68 111 103 226 128 188 240 159 144 182
//codeUnit的值(68 111 103)代表字符D,o,g,其UTF-8和字母对应ascii码值相同;(226 128 188)代表 DOUBLE EXCLAMATION MARK字符;(240, 159, 144, 182)代表DOG FACE
//UTF-16 Representation
for codeUnit in dogString.utf16 {
// print("\(codeUnit) ",terminator: "")
}
//print("")
// 68 111 103 8252 55357 56374
//(8252),等于16进制数203C代表Unicode scalar U+203C for the DOUBLE EXCLAMATION MARK character,(55357 and 56374)代表DOG FACE
//Unicode Scalar Representation
//使用字符串的unicodeScalars属性迭代获得Unicode scalar representation,属性是UnicodeScalarView类型,它是UnicodeScalar类型的集合,每一个UnicodeScalar都有value属性,返回scalar’s 21-bit value,被UInt32值代表
//
for scalar in dogString.unicodeScalars {
// print("\(scalar.value) ",terminator: "")
}
//print("")
// 68 111 103 8252 128054
for scalar in dogString.unicodeScalars {
// print("\(scalar) ",terminator: "")
}
//print("")
//D o g ! ! ?