变量和常量

var 来修饰变量,let 修饰常量

Swift 采取类型推倒,在定义变量时如果已知变量的类型时不需要写类型。不过不用担心,Swift 是一门静态类型的语言,在编译的时候也做类型检察的。

字符串

var 定义的字符串都是可变的,类似于 Objective-C 中的 NSMutableString,但是比它好在可以直接采用 + 来连接字符串。

如果你想让字符串不可更改,请定义成 let

Swift 中的字符串都是 value 类型的。当你把字符串赋值给变量或者当参数传入函数时,它的值会被拷贝。

数值类型

1
2
3
var r = 10
let pi = 3.14
var area = r * r * pi

这样做是不行的。Swift 中,所有的数字类型必须得是显示的转换。所以你得这么
干:

1
var area = Double(r) * Double(r) * pi

这里是构造的新的 Double 类型变量,类似于 C 中的强制转换,真实的 r 还是 Int 类型的。

布尔类型

判断的条件只能够使用布尔类型,Swift 不会把大于0的值当做 true。

元组(Tuples)

元组是一个可以包含多种类型的集合类型,所以定义元组的时候可以不需要指定类型(当然你可以指定类型)。

1
var tup = ("abc", 123, true)

访问元组元素的时候可以这样:tup.0

1
var dinner = (people: 3, place: "香格里拉")

这是为元组的元素起了名字,获取元素的时候就可以 dinner.people 这样了。

数组

存储有序集合的类型

1
2
3
4
5
6
//定义一个数组:
var array = [1, 2, 3, 4, 5]
//获取第二个元素
array[1]
//定义一个可以存储任何类型的数组
var awesomeArray: [AnyObject] = [123, 1.231, "asd"]

字典

字典是一个能够存储键值和值映射关系的集合。

1
2
3
4
5
6
//定义一个字典
var dic = [1.5: "One", 2: "Two"]
//当然字典也可以规定存储的类型
var diction: [Int:String] = [1: "One", 2: "Two"]
//通过键值寻找值
dic[1.5]

流程控制

for 循环

1
2
3
for i in 1...5 {
println(i)
}

类似于 Python 中的 for-in 循环,1…5 表示一个范围,是 Range 类型的,前后都包括,所以循环5遍。

当然也可以用 for-in 来遍历一个字符串。

1
2
3
for c in "Swift" {
println(c)
}

while 循环

Swift 支持 while 和 do-while 循环。跟 C 中类似,知识语法稍有不同(少个括号)。

1
2
3
4
5
var i = 0
while i < 100 {
println(i)
++i
}

if 和 switch

if 没什么好说的,对于 switch 可以谈谈。
Swift 中的 switch 必须有 default ,还有 switch 不需要加 break。

1
2
3
4
5
6
7
8
9
var score = 59
switch score {
case 1...59:
println("Failed!")
case 60...100:
println("Pass!")
default:
printin("NB!")
}

可选型(Optionals)

Swift 不允许在编译的时候定义未初始化的变量。如果你有一个 String 类型的变量,你在运行之前不知道它是什么,该怎么办呢?把它设置成 nil(var str: String = nil)? 同样,Swift 是不允许的,因为 nil 不是 String 类型的。这时候 optional 就派上用场了。
optional 的意思是,这个变量可能有值,也可能没有值。

声明
1
2
var str1: String?
var str2: String? = “This is Optional

这两种都可以。

获取

当调用可选型变量的成员方法时,有两种方法:

  1. 解包
1
2
3
4
if let unwrappedStr = str {
//str 有值的时候才会进入
println(str.uppercaseString)
}
  1. 弱制解包(自己起的。。。)

str2 = str2?.uppercaseStrig

str2 没有值的时候,这句话只会返回 nil,什么副作用也没有。有值的时候会返回 Optional(str)

  1. 强制解包
1
str!.uppercaseStrig

这样做的话,如果 str 当前为 nil,则程序会崩溃。
如果你非得这么用,必须确保这个可选型变量有值。

不需要获取方法的可选型变量声明
1
var str: String!

定义的时候,把问号改成了叹号。获取的时候不再需要以上几种方法。但是注意,如果在获取的时候如果变量为 nil, 程序会崩溃。