1、变量(Variable)

变量,可以理解为存放某一类型的值的容器,如:

var count:Int
var shouldRemind:BOOL
var text:String
var list:[ChecklistItem]

一个变量的数据类型,决定了它能存放什么类型的数据。有些变量只存放简单的值,如Int、Bool。另一些变量存放相对复杂一些的类型例如String、Array。

常见的基本数据类型:
存放整数的Int
存放浮点数的Float
存放布尔值的boolean
存放双精度浮点数的Double
存放单个字符的Characters
存放正整数的UInt
Core Graphics中存放浮点数的CGFloat

Swift对类型是很严格的,例如不能将一个Float类型的数据赋值给一个Int类型的变量。同样地,反过来也不行,Swift并不会自动帮我们转换。如:

var i = 10
var f: Float
f = i        //错误的
f = Float(i) //正确的

但在我们声明变量时,如果有初始值,我们可以不具体说明变量类型。Swift会使用类型推论(type inference),自动根据初始值决定数据类型。

var i = 10     //Int
var d = 3.14   //Double
var b = true   //BOOL
var s = "Hello,word" //String

上面例子中,d赋值为3.14时,Swift会推断为Double类型,即此时d为Doule类型变量。如果我们希望d为Float类型变量,可以加上显式的类型说明,以覆盖Swift的类型推论:

var f:Float = 3.14

对于类对象,我们需要先实例化对象。
我们来看一个例子(假定我们已创建了自定义的待办事件类ChecklistItem):

var item: ChecklistItem

对于上面的代码,我们声明了一个可以存放ChecklistItem对象的变量,但此时还没创建ChecklistItem对象,为此我们需要:

item = ChecklistItem()

执行上面的代码,我们称之为实例化对象,即创建了一个对象的实例。具体为:为实例分配一段内存空间,并调用默认的初始化方法。每个实例都会占用一段内存空间,实例保存着对象的属性。对于这句代码中的item,我们称之为实例变量。
当然,我们可以将上面两句代码合并为一句:

var item = ChecklistItem()

这里省略掉了显式的类型声明,因为Swift会通过类型推断,自动判定其为ChecklistItem类型,但是不能省略“()”,括号告诉了Swift我们需要创建一个ChecklistItem类型的实例。

有时,我们在创建对象实例时,会传入一些参数,例如:

var item = ChecklistItem(text:"Charge my iPhone",checked:false)
1、局部变量 vs 实例变量

我们常见的变量可以分为

  • 局部变量:只存活在所声明的函数方法内。方法结束,就会被销毁。
  • 实例变量:又称为属性,属于实例,在实例的所有方法中都可以使用。

看个例子:

class MyObject{
	var count = 0 //实例变量
	
	func myMethod(){
		var temp: Int //局部变量
		temp = count
	}

	//在myMethod方法之外,局部变量“temp”已不存在
}

如果局部变量和实例变量名字相同,此时在局部变量所在的方法内,会隐藏实例变量,我们应该避免这种情形,防止在我们希望用实例变量时,不小心用成了局部变量。(为了避免此类问题,我们可以在命名实例变量时,在其前添加下划线,如_count。或在方法内使用实例变量时,添加self)

3、变量 vs 常量

除了变量可以存放数据,常量也可以。

变量存储的数据,可以在app运行期间被改动。例如,在日记app中,用户可以修改日记中的文字,所以应该使用String类型的变量,当用户编辑日记时,变量可以跟着改变。有时我们需要保存固定不变的数据,例如保存一个一旦计算完后就不会再变化的计算结果,此时我们可以使用常量。例如:

let pi = 3.141592
let difference = abs(targetValue - currentvalue)
let message = "You scored \(points) points"
let image = UIImage(named:"SayCheese")

如果常量声明在函数方法内,常量会在方法结束时被销毁。而每次调用方法,都会重新创建一个常量,并且能被赋一个新值。在方法执行过程中它的值不能被修改。

4、值类型 vs 引用类型

基本数据类型(如int、string)、struct(如String、Array)、enum属于值类型,使用let声明为常量时,它的值不允许被改变:

let pi = 3.141592
pi = 3  //错误

类属于引用类型,当使用let声明为常量时,只有引用关系不允许被改变,而被引用的对象本身是可以改变的:

let item = ChecklistItem()
item.text = "Do the laundry"
item.checked = false
item.dueDate = yesterday

但是这样是不允许的:

let item = ChecklistItem()
item = anotherItem