Swift
基础
45
var anInteger = 2
大多数类型不能合并在一起,因为编译器不知道结果是什么类型。例如,不能把字符串
和整数相加,因为结果无意义:
//
错误:不能把字符串和整数相加
anInteger += "Yes"
2.8
处理字符串
Swift
中,字符串指
Unicode
字符序列。因此,字符串可以使用任何人类语言中的几
乎全部字符,如果想把应用翻译成其他语言,这是个好消息。
Swift
中创建字符串的方式很简单。我们可以创建一个字符串字面量,不包含任何内容,
这样创建的是空字符串。
let emptyString = ""
此外,还可以使用
String
类型的初始化方法创建空字符串:
let anotherEmptyString = String()
如果想检查字符串是否为空,可以使用
isEmpty
属性:
emptyString.isEmpty // = true
字符串可以使用
+
+=
算符拼接:
var composingAString = "Hello"
composingAString += ", World!" // = "Hello, World!"
在内部实现中,一个字符串是一个字符序列,分别表示一个
Unicode
字符。如果想迭代
字符串中的各个字符,可以使用
for-in
循环:
var reversedString = ""
for character in "Hello".characters {
reversedString = String(character) + reversedString
}
reversedString // = "olleH"
如果想计算字符串中有多少字符,可以使用
count
函数:
"Hello".characters.count // = 5
46
2
任何集合都能使用
count
函数,例如数组和字典。
注意,字符串中的字符数与字节数不同。一个
Unicode
字符占的字节数有
1
4
不等,具体的字节数由类型决定(例如表情符号占
4
字节)。
如果想改变字符串的大小写,可以使
uppercaseString
lowercaseString
属性。这
两个属性返回的是原字符串的修改版本。
string1.uppercaseString // = "HELLO"
string2.lowercaseString // = "hello"
2.8.1
比较字符串
==
运算符用于比较两个不同的字符串。这个运算符检查两个字符串的内容,看它们是否
包含相同的字符序列:
let string1 : String = "Hello"
let string2 : String = "Hel" + "lo"
if string1 == string2 {
print("The strings are equal")
}
在其他语言中,如
C
Objective-C
==
运算符检查两个值是否相等,或者两个变
量是否引用内存中的同一个位置。如果你确实想检查两个变量引用的是不是同一个
对象,可以使用
===
运算符:
if string1 as AnyObject === string2 as AnyObject {
print("The strings are the same object")
}
Swift
中,
AnyObject
的意思是“任何类型的任何对象”。
2.8.2
搜索字符串
可以使
hasPrefix
hasSuffix
方法检查字符串是否有某个前缀或后缀。
if string1.hasPrefix("H") {
print("String begins with an H")
}
if string1.hasSuffix("llo") {
print("String ends in 'llo'")
}
Swift
基础
47
2.8.3 Optional
类型
有时,经常要使用可能没有值的变量。例如,你可能想在一个变量中存储一个显示给用
户查看的数字,但是尚不知道那个数字是什么。如前所述,
Swift
变量必须有值。此时,
可以使用数字零表示“没有值”。其实,
C
C++
Java
Objective-C
等很多语言都是
这么做的。然而,这会导致一个问题:没办法区分零值和没有值。如果想显示的数字就
是零呢?
为了解决这个问题,
Swift
把“没有值”与其他所有值明确区分开了。“没有值”使用
nil
表示,这是与其他所有值都不同的类型。
如果你是从
Objective-C
转过来的,可能还记得,
nil
其实是指向零的
void
指针。
这意味着,严格来说,在
Objective-C
nil
是数字,因此可以像下面这样使用:
int i = (int)(nil)+2;
//
等于
2
(因为
0 + 2 = 2
Swift
不允许这样用,因为
nil
Int
是不同的类型。
可是,前文说过,
Swift
的变量必须有值。如果想让变量的值有时为
nil
,要把它声明为
Optional
类型。在不确定的情况下可以这么做。比如说,从网上下载图像时,无法确定
得到的是图像文件还是其他乱七八糟的东西,此时可以定义一个
Optional
类型的变量,
方法是在类型后面加上问号(
?
):
// Optional
类型的整数,可以为
nil
var anOptionalInteger : Int? = nil
anOptionalInteger = 42
只有声明为
Optional
类型的变量才能设为
nil
。否则,不允许设为
nil
//
不是
Optional
类型的变量(常规变量),不允许设为
nil
var aNonOptionalInteger = 42
aNonOptionalInteger = nil
//
错误:只有
Optional
类型的值才能设为
nil
声明
Optional
类型的变量时如果没赋值,
则默认值为
nil
可以使用
if
语句检查
Optional
类型的变量中有没有值:
48
2
if anOptionalInteger != nil {
print("It has a value!")
} else {
print("It has no value!")
}
Optional
类型的变量可以拆包(
unwrap
),获取变量的值。拆包使用
!
字符。
注意,如果
Optional
类型的变量没有值,拆包会导致程序抛出运行时错误,从而致使程
序崩溃:
// Optional
类型必须使用
!
拆包
anOptionalInteger = 2
1 + anOptionalInteger! // = 3
anOptionalInteger = nil
1 + anOptionalInteger!
//
崩溃:
anOptionalInteger = nil
,不能使用
nil
如果不想每次都拆包
Optional
类型的变量,可以把变量声明为隐式拆包的
Optional
类型,
如下所示:
var implicitlyUnwrappedOptionalInteger : Int!
implicitlyUnwrappedOptionalInteger = 1
1 + implicitlyUnwrappedOptionalInteger // = 2
隐式拆包的
Optional
类型是常规的
Optional
类型,值可以是
nil
,也可以不是。不过,
访问这种变量时,编译器会自动拆包。
这样能直接使用变量的值,但是不安全,因为拆包没有值的变量时,程序会崩溃。
把变量声明为隐式拆包的
Optional
类型之后,使用变量时不用显式拆包,这会让你
忘记变量的值有时可能是
nil
。因此,使用时要小心。
可以使用
if-let
语句检查
Optional
类型的变量有没有值,如果有,则把值赋值给一个
常量,然后运行一些代码。这样能省去好几行代码,而且能保证安全,因为我们事先已
经检查
Optional
类型的变量有没有值。
if-let
语句的用法如下:
var conditionalString : String? = "a string"
if let theString = conditionalString {
Swift
基础
49
print("The string is '\(theString)'")
} else {
print("The string is nil")
}
//
打印
"The string is 'a string'"
2.8.4
类型转换
Swift
是强类型语言,因此给函数传递参数时要使用指定的类型。有时,需要检查实例的
类型,或者把实例当做其他类型使用,这便要转换类型。
is
as!
as?
运算符用于测试类型和向下转换(把实例当做某个子类)。我们将在第
3
章讨论子类。
这三个运算符还能用于检查类型是否符合某个协议。我们将在第
3
章详细说明协议。
is
运算符用于检查实例是否属于某个子类,例如:
if thing is String {
print("Thing is a string!")
}
as?
运算符用于检查变量的类型,返回指定类型的
Optional
值:
var maybeString = thing as? String
// maybeString
的类型是
String?
,即
Optional
类型的字符串
//
如果检查失败,
maybeString
的值是
nil
as!
运算符的作用与
as?
相同,不过返回的是指定类型,而不是
Optional
值。如果不能
把值转换成指定的类型,程序会崩溃。
如果十分确定能把值转换成指定的类型,则无需处理
Optional
值,应该使用
as!
算符。
var definitelyString = thing as! String
// definitelyString
是字符串,而且确定有值
Swift
中,特定的类型之间可以相互转换。例如,
Int
类型可以转换成
String
类型,如
下所示:
let aString = String(2)
// = "2"

Get Swift学习手册 now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.