属性:存储属性、计算属性。存储属性和计算属性通常和特定类型的实例相关联。
存储属性只能由类、结构体定义。
计算属性可以由类、结构体、枚举定义。
存储属性
一个实例的存储属性既可以有常量存储属性(let关键字定义),也可以有变量存储属性(var关键字定义)。如下:
/*
结构体是值类型,类是引用类型。当一个值类型的实例被标记为常量时,该实例的其他属性也均为常量。
类是引用类型,如果你给常量复制饮用类型实例,仍然可以修改实例的变量属性。
*/
struct Abc{
var x : Int
let y : Int
}
var c = Abc(x:0, y:1) //x是变量存储属性,y是常量存储属性,y一旦赋值则不可修改
let d = Abc(x:2, y:3) //因为d是定义为常量,它所代表的Abc的实例叫常量结构体,常量结构体里的存储属性不管是变量存储属性还是常量存储属性,均不可修改。
/*
下面再列举类的实例,用以说明“类实例的存储属性” 与 “结构体实例的存储属性” 的不同之处
*/
class Abc1{
var i : Int = 4
let j : Int = 1
}
var c1 = Abc1() //i是变量存储属性,j是常量存储属性,y一旦赋值则不可修改
c1.i=1
let d1 = Abc1() //因为类为饮用类型,即便d1定义为常量,它所代表的实例仍可以修改i这个变量属性的值
d1.i=2
如果一个变量存储属性不是在每次初始化时都会用到,只需要在第一次使用时才进行计算的话,可以在其声明前加关键字lazy(即延迟存储属性)。
延迟存储属性必须定义为变量,因为变量的初始值可以不用在初始化完成之前取得,但是常量属性必须在初始化完成之前取得值。
例如:
struct A1{
//var j = 4
var x : Int=0
}
var a = A1(x:1)
print("a的属性x的值为\(a.x)")
/*
/在类中定义lazy属性
*/
class B1{
//var i = 3
lazy var y = A1()
}
var b = B1()
print("b的属性y的值为\(b.y.x)")
/*
在结构体中定义lazy属性
*/
struct C1{
lazy var z = A1()
}
var c = C1()
print("c的属性z的值为\(c.z.x)")
执行结果:
a的属性x的值为1
b的属性y的值为0
c的属性z的值为0