字符串面量
字符串字面量是由双引号 (“”) 包裹着的具有固定顺序的文本字符集。 字符串字面量可以用于为常量和变量提供初始值:
var emptyString = "" //空字符串面量 var anotherEmptyString = String()//初始化方法 //两个字符串均为空并等价
也可以通过Boolean类型的isEmpty属性判断字符串是否为空
if emptyString.isEmpty { print("--------") }
字符串可变性
可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改:
var v = "a" v += "b" //可变的 let l = "a" l += "b" //常量的不可变编译错误
注意:在 Objective-C 和 Cocoa 中,您需要通过选择两个不同的类(NSString和NSMutableString)来指定该字符串是否可以被修改。
可以在for-in循环来遍历字符串中的characters属性来获取每一个字符的值:
for charter in "Hello".characters { print(character) }
通过标明一个character类型并用字符字面量进行赋值,可以建立一个独立的字符常量或变量:
let exclamationMark: Character = "!"
字符串通过传一个值类型Character的数组作为自变量来初始化:
let catCharacter: [Character] = ["H","e","l","o"] let catString = String(catCharacters) print(catString)
连接字符串
字符串通过加法运算符(+
)连接在一起:
let string1 = "hello" let string2 = "you" var welcome = string1 + string2 //值为hello you
也可以通过加法赋值运算符(+=
)将一个添加到一个几经存在字符串变量上:
var string = "hai" string += string2 //值为hai you
也可以用append
方法将一个字符附加到一个字符串变量的尾部:
let exclamationMark: Character = "!" welcome.append(exclamationMark) //值为 hello you !
注意:
您可以用append方法将一个字符附加到一个字符串变量的尾部:
字符串插值
插入字符串面量的每一项都在以反斜线为前缀的圆括号中:
let a = 3 let b = "\(a) times 2.5 is \ (Double(a) * 2.5)" // b 是 "3 times 2.5 is 7.5"
注意:
插值字符串中写在括号中的表达式不能包含非转义双引号 (“) 和反斜杠 (),并且不能包含回车或换行符
字符串索引
每一个字符串都有一个关联的索引(index)类型,String.index,它对应着字符串中的每一个字符的位置。
前面提到,不同的字符可能会占用不同的内存空间数量,所以要知道字符的确定位置,就必须从字符串开头遍历每一个 Unicode 标量到字符串结尾。因此,Swift 的字符串不能用整数(integer)做索引。
使用startIndex属性可以获取字符串的第一个字符。使用endIndex属性可以获取最后的位置(其实endIndex在值上与字符串的长度相等)。如果字符串是空值,startIndex和endIndex是相等的
let a = "hello Mr.solo" println(a.startIndex) //0 println(a.endIndex) //13
也可以通过下表来获得string对应位置的Character:
a[a.startIndex] //h
通过调用String.Index的predecessor()方法,可以立即得到前面一个索引,调用successor()方法可以立即得到后面一个索引。任何一个字符串的索引都可以通过锁链作用的这些方法来获取另一个索引,也可以调用advance(start:n:)函数来获取。但如果尝试获取出界的字符串索引,就会抛出一个运行时错误。 你可以使用下标语法来访问字符在字符串的确切索引。尝试获取出界的字符串索引,仍然抛出一个运行时错误。
let a = "hello Mr.solo" a[a.startIndex] //h a[a.endIndex.predecessor()] //o a[a.startIndex.successor()] //e let index = advance(a.startIndex,11) a[index] //l a[a.endIndex] //错误 a.endIndex.successor() //错误
使用全局函数indices会创建一个包含全部索引的范围(Range),用来在一个字符串中访问分立的字符串。
for index in a.characters.indices { print("\(a[index])",appendNewline: false) } //print "h e l l o M r . s o l o"
插入的删除
调用 insert(_:aatIndex:)
方法可以在一个字符串的指定索引插入一个字符。
var a = "hello" a.insert("!",atIndex: Welcome.endIndex)
调用 splice(_"atIndex:)
方法可以在一个字符串的指定索引插入一个字符串。
a.splice(" there".characters,atIndex: a.endIndex.predecessor()) // a 现在等于 "hello there!"
调用removeAtIndex(_:)
方法可以在一个字符串的指定索引删除一个字符。
a.removeAtIndex(a.endIndex.predecessor()) // a 现在等于 "hello there"
调用removeRange(_:)
方法可以在一个字符串的指定索引删除一个子字符串。
let range = advance(a.endIndex,-6)..<a.endIndex a.removeRange(range) // a 现在等于 "hello"
比较字符串
Swift 提供了三种方式来比较文本值:字符串字符相等、前缀相等和后缀相等。
字符串/字符可以用等于操作符(==)和不等于操作符(!=),详细描述在比较运算符:
let a = "hello" let b = "hello" if a == b { print("yes") }
前缀/后缀相等
通过调用字符串的hasPrefix(:)/hasSuffix(:)方法来检查字符串是否拥有特定前缀/后缀,两个方法均需要以字符串作为参数传入并传出Boolean值。
let a = “abcdefg”
if a.hasPrefix("ab"){ print("以ab开头") } if a.hasSuffix("fg"){ print("以fg结尾") }