一、引言
本系列专题是我通过阅读Swift2.2语言开发文档,翻译总结加上自己的理解整理而成。其中大部分结构和内容都来自开发文档,有疏漏和错误之处,还望更多朋友指出,共同交流进步,我的QQ:316045346。
二、从HelloWorld开始
在学习很多编程语言时,都是从HelloWorld入门,下面代码就是一个完整的HelloWorld程序:
print("Hello, World!")
分析上面代码,可以发现Swift语言的3个十分明显的特点:
1.开发者不需要引入输入输出相关的函数库。
2.在编写代码时,不需要在语句的结尾处添加分号。
3.全局的代码就是程序的入口,不需要类似C系语言的main()方法来作为程序入口。
三、常量与变量
常量和变量是编程语言中最基础的两类数据类型,常量可以理解为为某个值起一个特定的名字,常量通常提供给开发者用于某些只赋值一次但却在程序中多处使用的量值。变量也可以进行多次修改。分别使用let和var创建常量和变量。例如:
let letValue = 4
var varValue = 8
varValue = 16
开发者在进行常量和变量的创建时,并不需要制定类型,编译器与根据第一次赋值的类型来推断出常量或者变量的类型,然而这并不是说Swift语言不严格要求变量或常量的类型,一旦编译器推断了值的类型,之后开发者若要修改变量,则必须严格遵守既定的变量类型,否则编译器会报错。
如果开发者第一次对变量或常量进行的赋值不能够使编译器正确的推断出常量或变量的类型,开发者也可以通过冒号后跟类型的方式来强制定义变量或常量的类型,如下:
var varValue:Float = 8
varValue = 16.0
在Swift语言中,不存在隐式转换的概念,这也是Swift语言更加安全的特性之一,这样的设计可以保证变量在任何时候类型都被明确的指定。在进行类型转换时,可以通过类实例化的方式进行,示例如下:
//Float值转成Int
letValue+Int(varValue)
//Int转为Float
Float(letValue)+varValue
对于在字符串中使用其他类型的变量,Swift语言提供了一种更加便捷的写法,使用\()的方式来转换,小括号内为变量的名称,例如:
var strValue = "Hello"
//Hello16.0
strValue+"\(varValue)"
四、数组与字典
数组与字典是最常用的两种数据集合,在Swift语言中,使用[]来创建数组或字典,示例如下:
var array = [1,2,3]
var dic = [1:"one",2:"two",3:"three"]
同Int,Float类型的数据一样,数组和字典在第一次赋值时,也会根据赋值的类型来推断出变量类型,开发者同样也可以强制指定,如下:
var array:[Int] = [1,2,3]
var dic:[Int:String] = [1:"one",2:"two",3:"three"]
Swift允许创建或者重新赋值为空的数据或者字典,但是这有一个前提条件,被赋值为空的数据或字典必须是类型确定的,示例如下:
//这样写会报错
//var errorArray = []
//创建空的数据集合
//方式一
var array:[Int] = []
var dic:[Int:String] = [:]
//方式二
var array2 = [Int]()
var dic2 = [Int:String]()
//方式三
var array3 = [1]
var dic3 = [1:"1"]
array3 = []
dic3 = [:]
五、optional类型的值
在理解optional类型的值之前,我们可以先来看一段C代码:
int a=1;
if(a){
}else{
}
上面这段代码对于C语言来说完全没有问题,当a为非0值时,就代表条件为真,在Swift语言中则不同,if选择语句中的条件必须为Bool类型的值,因此,对于某些可以为空的值,Swift中提供了optional类型,这种类型相当于对其他实际类型进行了包装,如果有值,则他拆包后为相应类型的值,如果没有值,则为空值nil。示例如下:
var optionalString: String? = "Hello"
if optionalString == nil {
}
在Swift中,当if与let共同使用时,将会构成一种更加奇特的语法方式,这种方式对于处理optional类型的值十分方便,示例如下:
/*
if let 后面赋值为optional类型的值有这样的效果
如果optional的值不为nil 则会走if条件为真的语句块并且将optional变量的值赋值给let常量 可以在if为真的语句块中使用
如果optional的值为nil 则会走else语句块 并且name常量被释放 不能再else块中使用
*/
if let name=optionalName {
greeting = "Hello, \(name)"
}else{
print(greeting)
}
除了if let语法外,还有一种方式可以用来处理optional类型的值,示例如下:
var greeting = "Hello!"
greeting = "Hello" + (optionalString ?? "")
??运算符用来为optional类型的值设置一个默认值,如果optional值为nil,则会使用后面设置的默认值来代替。
Swift语言的switch语句相比于C系的语言要强大的多,其不只可以用于判断整型,其可以处理任意类型的数据,同样,它也不只限于比较是否相等的运算,其可以支持各种负责运算,示例如下:
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup.")
}
如果匹配上了一个case,程序会结束switch选择,各个case之间是互斥的。
六、循环语句
Swift2.2中,弃用了for i;param;param{}格式的循环语句,提供给开发者使用的循环语句主要有3种。
1.for in语句
for in语句多用于快速遍历字典,示例如下:
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
for number in numbers {
//找出最大值
if number > largest {
largest = number
}
}
}
print(largest)
在for in循环中可以使用一个索引来指定循环次数,通过这种方式可以实现有序的遍历操作,示例如下:
for i in 0..<10 {
print(i)
}
2.while语句
while语句用于条件循环,直到不再满足某个条件为止,示例如下:
var n = 2
while n < 100 {
n = n * 2
}
print(n)
3.repeat {}while语句
repeat{}while语句与C语言中的do{}while作用相同,保证至少循环一次。示例如下:
var m = 2
repeat {
m = m * 2
} while m < 100
print(m)