初始化空字符串 (Initializing an Empty String)
为了构造一个很长的字符串,可以创建一个空字符串作为初始值。 可以将空的字符串字面量赋值给变量,也可以初始化一个新的String实例:
<pre><code>
var emptyString = "" // 空字符串字面量
var anotherEmptyString = String() // 初始化 String 实例
// 两个字符串均为空并等价。
</code></pre>
<pre><code>
您可以通过检查其Boolean类型的isEmpty属性来判断该字符串是否为空:</code></pre>
<pre><code>
if emptyString.isEmpty
{
println("什么都没有")
}
// 打印输出:"什么都没有"
</code></pre>
计算字符数量 (Counting Characters)
通过调用全局countElements
函数,并将字符串作为参数进行传递,可以获取该字符串的字符数量。
<pre><code>
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(countElements(unusualMenagerie)) characters")
// 打印输出:"unusualMenagerie has 40 characters"
</code></pre>
注意:
不同的 Unicode 字符以及相同 Unicode 字符的不同表示方式可能需要不同数量的内存空间来存储。所以 Swift 中的字符在一个字符串中并不一定占用相同的内存空间。因此字符串的长度不得不通过迭代字符串中每一个字符的长度来进行计算。如果您正在处理一个长字符串,需要注意countElements函数必须遍历字符串中的字符以精准计算字符串的长度。 另外需要注意的是通过countElements返回的字符数量并不总是与包含相同字符的NSString的length属性相同。NSString的length属性是基于利用 UTF-16 表示的十六位代码单元数字,而不是基于 Unicode 字符。为了解决这个问题,NSString的length属性在被 Swift 的String访问时会成为utf16count。
字符串插值 (String Interpolation)
字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。 您插入的字符串字面量的每一项都被包裹在以反斜线为前缀的圆括号中:
<pre><code>
let multiplier = 3
let message = "\(multiplier) 乘以 2.5 是 \(Double(multiplier) * 2.5)"
// message 是 "3 乘以 2.5 是 7.5"
</code></pre>
在上面的例子中,multiplier作为\(multiplier)
被插入到一个字符串字面量中。 当创建字符串执行插值计算时此占位符会被替换为multiplier实际的值。
multiplier的值也作为字符串中后面表达式的一部分。 该表达式计算Double(multiplier) * 2.5
的值并将结果 (7.5) 插入到字符串中。 在这个例子中,表达式写为\(Double(multiplier) * 2.5)
并包含在字符串字面量中。
注意:
插值字符串中写在括号中的表达式不能包含非转义双引号 (")
和反斜杠 (\)
,并且不能包含回车或换行符。
比较字符串 (Comparing Strings)
Swift 提供了三种方式来比较字符串的值:字符串相等、前缀相等和后缀相等。
字符串相等 (String Equality)
如果两个字符串以同一顺序包含完全相同的字符,则认为两者字符串相等:
<pre><code>let quotation = "我们是一样一样滴."
let sameQuotation = "我们是一样一样滴."
if quotation == sameQuotation {
println("这两个字符串被认为是相同的")
}
// 打印输出:"这两个字符串被认为是相同的"</code></pre>
前缀/后缀相等 (Prefix and Suffix Equality)
通过调用字符串的hasPrefix/hasSuffix
方法来检查字符串是否拥有特定前缀/后缀。 两个方法均需要以字符串作为参数传入并传出Boolean值。 两个方法均执行基本字符串和前缀/后缀字符串之间逐个字符的比较操作。
下面的例子以一个字符串数组表示莎士比亚话剧《罗密欧与朱丽叶》中前两场的场景位置:
<pre><code>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"
]
</code></pre>
您可以利用 hasPrefix
方法来计算话剧中第一幕的场景数:
<pre><code>var act1SceneCount = 0
for scene in romeoAndJuliet {
if scene.hasPrefix("Act 1 ") {
++act1SceneCount
}
}
println("There are (act1SceneCount) scenes in Act 1")
// 打印输出:"There are 5 scenes in Act 1"</code></pre>
相似地,您可以用hasSuffix
方法来计算发生在不同地方的场景数:
<pre><code>var mansionCount = 0
var cellCount = 0
for scene in romeoAndJuliet {
if scene.hasSuffix("Capulet's mansion") {
++mansionCount
} else if scene.hasSuffix("Friar Lawrence's cell") {
++cellCount
}
}
println("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
// 打印输出:"6 mansion scenes; 2 cell scenes”
</code></pre>
大写和小写字符串(Uppercase and Lowercase Strings)
您可以通过字符串的uppercaseString
和lowercaseString
属性来访问大写/小写版本的字符串。
<pre><code>
import Foundation
let normal = "Could you help me, please?"
let shouty = normal.uppercaseString
// shouty 值为 "COULD YOU HELP ME, PLEASE?"
let whispered = normal.lowercaseString
// whispered 值为 "could you help me, please?"
</code></pre>