初始化一个空的String
初始化一个空的字符串有两种方式:
1.var emptyString = ""
2.var anotherEmptyString = String()
上面这两种方式完全相同,我们可以通过字符串的isEmpty属性来判断是否为空
String的可变性
这完全取决于变量是let还是var
字符串是值类型
字符串的深复制还是浅复制取决于编译器,有一条原则是程序员不用担心自己传入一个方法或者一个变量的字符串,被偷偷的改变。
字符的一些用法
1. for character in "Dog!?".characters {
print(character)
}
2.let(或者var) exclamationMark: Character = "!" 可以设置一个单独的Character类型
3.Character数组可以初始化String
let catCharacters: [Character] = ["C", "a", "t", "!", "?"]
let catString = String(catCharacters)
print(catString)
字符串和字符的一些运算
let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
// welcome now equals "hello there"
var instruction = "look over"
instruction += string2
// instruction now equals "look over there"
let exclamationMark: Character = "!"
welcome.append(exclamationMark)
// welcome now equals "hello there!"
插值字符串
我们可以通过/()的方式把其他变量变为字符串如:
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"
我们还要注意/()里不能包含回车,换行,和\;
字符串里的特殊字符
1.\0 (空字符), \\ (反斜杠), \t (horizontal tab), \n (换行), \r (回车), \" (double quote) and \' (single quote)
2.\u{n}其中n为长1-8位的16进制数,代表一个unicode的字符串
扩展字元簇(Extended Grapheme CGrapheme是指某种lusters)
自然语言中的最小单元,它并不一定有实际意义,但是它们组合成这种语言的单个字符。Swift语言的每个字符(Character)都是一个独立的扩展字元 簇,一个扩展字元簇就是由一个或多个Unicode scalar(Unicode纯量)的有序排列从而组合成可读的字符。
比如:字母é可以是一个单独的Unicode scalar:U+00E9,也可以是多个纯量的组合:U+0065U+0301 (其中U+0065就是字母e)。在Swift中,这两种情况都认为是一个字符,因此获取字符串长度的时候(用全局函数count()),返回的值是相同的,这意味着字符串的改变并不一定意味着其长度发生变化。
注意区分这和OC中NSString的length的区别,NSString的长度是基于字符串在UTF-16编码表示时其中包含的16位的单元的个数,而不是Unicode扩展字元簇的数目。为了反映这个区别,NSString的length属性在Swift中用utf16Count函数来代替。
字符串中字符的数量:
我们可以通过字符串的characters属性的count属性获取字符数量。如:
let unusualMenagerie = "Koala ?, Snail ?, Penguin ?, Dromedary ?"
print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")
// Prints "unusualMenagerie has 40 characters"
但我们要注意的是我们给字符串加上Unicode纯量的时候,字符串的数量不一定会改变(字符串的长度并不取决于Unicode纯量所占内存单元的数量,而是Character数量):
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 cafe? is 4"
字符串API
1.可以通过下标获取字符串中的字符
需要我们注意的是下标不能是数字,我们只能通过String的startIndex和endIndex来进入字符串,获取字符,通过index(before:)、 index(after:)或
index (_:offsetBy:)来遍历字符
let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a
//注意下面的方法
for index in greeting.characters.indices {
print("\(greeting[index]) ", terminator: "")
}
2.插入和移动
插入字符 insert(_:at:)
插入字符串 insert(contentsOf:at:)
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome now equals "hello!"
welcome.insert(contentsOf:" there".characters, at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there!"
移动一个字符 remove(at:)
移动一个字符串 removeSubrange(_:)
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there"
let range = welcome.index(welcome.endIndex, offsetBy: -6)..
welcome.removeSubrange(range)
// welcome now equals "hello"
3.字符串比较
1)字符和字符串的比较,这完全取决于拓展字符是否相同
2)hasPrefix(_:) and hasSuffix(_:) 判断是否有某个字符串