常量和变量
用let声明常量,用var声明变量
let numberOne = 10
var numberTwo = 0
同一行中声明多个常量或者多个变量,可以用逗号隔开:
var x = 0.0, y = 0.0, z = 0.0
类型标注
用来表明常量或者变量中要存储的值的类型。格式为,在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。
如下例子给message变量添加了类型标注,表示这个变量可以存储String类型的值:
var message: String
在同一行中定义多个同样类型的变量,可以用逗号分割,并在最后一个变量名之后添加类型标注:
var red, green, blue: Double
常量和变量的命名可以用任何你喜欢的字符作为常量和变量名,包括 Unicode 字符:
let π = 3.1415926
let你好 = "你好这个世界"
let = "dogandcow"
常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。也不能以数字开头。
输出常量和变量
print(friendly)
// 输出 "Bonjour!"
print(_:separator:terminator:)是一个用来输出一个或多个值到适当输出区的全局函数。
Swift 用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift 会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:
print("The current value of friendly is \(friendly)")
// 输出 "The current value of friendly is Bonjour!
注释
// 这是一个注释
/* 这是一个, 多行注释 */
/* 这是第一个多行注释的开头 /* 这是第二个被嵌套的多行注释 */ 这是第一个多行注释的结尾 */
分号
Swift 并不强制要求在语句的结尾处使用分号(;)当你打算在同一行内写多条独立的语句时,必须使用分号如下:
let cat = ""; print(cat)
// 输出 ""
整数
Swift 提供了8,16,32和64位的有符号和无符号整数类型。这些整数类型和 C 语言的命名方式很像,比如8位无符号整数类型是UInt8,32位有符号整数类型是Int32。就像 Swift 的其他类型一样,整数类型采用大写命名法。
整数范围
你可以访问不同整数类型的min和max属性来获取对应类型的最小值和最大值:
let minValue = UInt8.min// minValue 为 0,是 UInt8 类型
let maxValue = UInt8.max// maxValue 为 255,是 UInt8 类型
Int
Swift 提供了一个特殊的整数类型Int,长度与当前平台的原生字长相同:
?在32位平台上,Int和Int32长度相同。
?在64位平台上,Int和Int64长度相同。
UInt
Swift 也提供了一个特殊的无符号类型UInt,长度与当前平台的原生字长相同:
?在32位平台上,UInt和UInt32长度相同。
?在64位平台上,UInt和UInt64长度相同。
类型安全和类型推断
如果你没有显式指定类型,Swift 会使用类型推断(type inference)来选择合适的类型。有了类型推断,编译器可以在编译代码的时候自动推断出表达式的类型。原理很简单,只要检查你赋的值即可。
数值型字面量
整数字面量可以被写作:
?一个十进制数,没有前缀
?一个二进制数,前缀是0b
?一个八进制数,前缀是0o
?一个十六进制数,前缀是0x
下面的所有整数字面量的十进制值都是17:
let decimalInteger = 17
let binaryInteger = 0b10001// 二进制的17
let octalInteger = 0o21// 八进制的17
let hexadecimalInteger = 0x11// 十六进制的17
整数和浮点数转换
整数和浮点数的转换必须显式指定类型:
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
类型别名
类型别名(type aliases)就是给现有类型定义另一个名字。
例如下:
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min
// maxAmplitudeFound 现在是 0
布尔值
Swift 有一个基本的布尔(Boolean)类型,叫做Bool。Swift 有两个布尔常量,true和false:
let orangesAreOrange = true
let turnipsAreDelicious = false
元组
元组(tuples)把多个值组合成一个复合值。元组内的值可以是任意不同类型
例:(404, "Not Found")
let http404Error = (404, "Not Found")
// http404Error 的类型是 (Int, String),值是 (404, "Not Found")
(404, "Not Found")元组把一个Int值和一个String值组合起来表示 HTTP 状态码的两个部分:一个数字和一个人类可读的描述。这个元组可以被描述为“一个类型为(Int, String)的元组”。
你可以将一个元组的内容分解(decompose)成单独的常量和变量,然后你就可以正常使用它们了:
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// 输出 "The status code is 404"
print("The status message is \(statusMessage)")
// 输出 "The status message is Not Found"
如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记:
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// 输出 "The status code is 404"
此外,你还可以通过下标来访问元组中的单个元素,下标从零开始:
print("The status code is \(http404Error.0)")
// 输出 "The status code is 404"
print("The status message is \(http404Error.1)")
// 输出 "The status message is Not Found"
你可以在定义元组的时候给单个元素命名:
let http200Status = (statusCode: 200, description: "OK")
给元组中的元素命名后,你可以通过名字来获取这些元素的值:
print("The status code is \(http200Status.statusCode)")
// 输出 "The status code is 200"
print("The status message is \(http200Status.description)")
// 输出 "The status message is OK"
可选类型
使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示:
?有值,等于 x
或者
?没有值
来看一个例子。Swift 的Int类型有一种构造器,作用是将一个String值转换成一个Int值。然而,并不是所有的字符串都可以转换成一个整数。字符串"123"可以被转换成数字123,但是字符串"hello, world"不行。
下面的例子使用这种构造器来尝试将一个String转换成Int:
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推测为类型 "Int?",或者类型 "optional Int"
因为该构造器可能会失败,所以它返回一个可选类型(optional)Int,而不是一个Int。一个可选的Int被写作Int?而不是Int。问号暗示包含的值是可选类型,也就是说可能包含Int值也可能不包含值。(不能包含其他任何值比如Bool值或者String值。只能是Int或者什么都没有。)
nil
你可以给可选变量赋值为nil来表示它没有值:
var serverResponseCode: Int? = 404
// serverResponseCode 包含一个可选的 Int 值 404
serverResponseCode = nil
// serverResponseCode 现在不包含值
注意:
nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil:
var surveyAnswer: String?
// surveyAnswer 被自动设置为 nil
注意:
Swift 的nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。
if 语句以及强制解析
你可以使用if语句和nil比较来判断一个可选值是否包含值。你可以使用“相等”(==)或“不等”(!=)来执行比较。
如果可选类型有值,它将不等于nil:
if convertedNumber != nil {
print("convertedNumber contains some integer value.")
}
// 输出 "convertedNumber contains some integer value."
当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping):