常量和变量是关联着特定类型的值的名字,值无法被修改的叫做常量,在未来可以被修改的叫做变量。
声明
常量和变量在使用前都需要被声明。使用了let关键字来声明常量,使用var关键字声明变量。下面是一个例子,来说明如何使用常量和变量来表示和追踪一个用户已经尝试了说少次登录操作
let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0
以上代码可以理解为:
声明了一个常量叫做maximumNumberOfLoginAttempts,初始化值为10,随后声明了一个变量currentLoginAttempt,初始化值为0。
这个例子中,允许登录的次数被声明为常数,因为允许登录的次数是不会变化的。而当前登陆的次数被声明为变量,因为这个值在每次登陆失败之后都会自增1。
我们可以在同一行声明多个变量或者常量,使用逗号分隔:
var x = 0.0, y = 0.0, z = 0.0
Note: 如果代码中要保存的值是不会改变的,那么总是使用let关键字声明为常量,而仅仅使用变量来保存那些需要被改变的值
类型注释(Type Annotations)
为了可以明确的表达一个变量或者常量可以保存哪一种类型的值,你可以提供类型注释。那么如何写类型注释呢,可以在一个变量或者常量后面跟随一个冒号,一个空格和具体的类型来实现,比如:
var welcomeMessage: String
声明中的冒号可以理解为xxx类型的xxx,所以这句代码可以读为:
声明了一个叫做welcomeMessage的可以保存String类型的值的变量
现在这个welcomeMessage变量就可以成功保存任何的文本数据了:
welcomeMessage = "Hello"
我们可以在同一行定义多个相同类型的变量,只要把类型注释放在最后一个变量后面就可以了。
var red, green, blue: Double
NOTE:在实践中,我们很少需要自己提供类型注释,当你给常量或者变量提供了初始值,Swift基本可以通过常量或者变量的初始值推断出变量或者常量的类型。在上面welcomeMessage的例子中,由于并没有提供初始值,所以通过类型注释来指定类型而不是通过初始值来推断类型。
常量和变量的命名
常量和变量的命名可以使用基本所有的字符,甚至了Unicode字符:
let π = 3.14159
let 你好 = "你好世界
let 🐶🐮 = "dogcow"
常量和变量的名字不包含空格,数学符号,箭头,Swift私有的UniCode 代码单元,横线-或者Box-drawing字符。数字可以放在变量或者常量名字中除了首位之外的其他所有位置。
一个变量或者常量已经被声明为某一个明确的类型,将不再允许用相同的名字去声明另外一个变量或者改变为另外一个类型。当然变量和常量也不可以相互转化。
NOTE:如果你需要使用Swift保留的关键字去声明一个相同名字的常量或者变量,请在使用关键字的时候给关键字加上单引号。不管如何,如果不是在束手无策的情况下避免使用Swift保留的关键字
我们可以将一个变量的值变成另外一个类型兼容的值,在例子中,friendlyWelcome的值从"Hello!"变成了"Bonjour!"。
var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"
和变量不一样,常量一旦被复制了之后就不可以改变。试图去修改会在编译的时候得到错误:
let languageName = "Swift"
languageName = "Swift++"
以上代码会得到编译错误languageName cannot be changed。
打印常量和变量
打印变量或者常量当前的值可以使用print(_:separator:terminator:)函数:
print(friendlyWelcome) // 会在控制台打印出"Bonjour!"
print(_:separator:terminator:)函数是一个全局函数,它可以把一个或者多个值以一个合适的方式输出。在Xcode中,该函数把输出打印到Xcode的控制台中。separator和terminator参数都有缺省值,在使用print函数的时候可以忽略它们。默认情况下,Print函数通过添加一个换行符来终止打印的行。如果希望打印不跟随换行符的值,给入参terminator传入空字符串""。
在一个长字符串中,Swift使用字符串插入(string interpolation)的方式将一个常量或者变量作为一个占位符插入在长字符串中,并且提示Swift用这个常量或者变量当前的值替换。将插入语用括号包含并且在括号前添加反斜杠就可以实现。
print("The current value of friendlyWelcome is \(friendlyWelcome)")
//打印 "The current value of friendlyWelcome is Bonjour! "
注释
基本和C还有OC一样
//
/**/ 不同点,可以嵌套
冒号
可以省略,在同一行写多个表达式的时候需要冒号