一.存储属性,存储常量(let)或者变量(var)。
1.1 常量存储属性不可以更改,变量存储属性可以更改
struct Birthday{
let birthday:String
var age:Int
}
var myBirthday=Birthday(birthday: "1991-09-13", age: 23)
myBirthday.age=20
1.2 如果创建了一个结构体的实例并赋值给一个常量,则无法修改实例的任何属性,即使定义了变量存储属性:
let yourBirthday=Birthday(birthday: "1994-01-11", age: 20)
1.3 如果结构体实例是一个常量,则属性不可以更改.
原因:结构体是属性值类型,当其实例被声明为常量时,他的属性也相应成了常量。
而类则不同,类属于引用类型,把引用类型的实例复制给常量后,仍然可以修改实例的变量属性。
1.4延迟存储属性
延迟存储属性,是指第一次被调用的时候才会计算其初始值的属性。延迟属性以lazy开头表示,必须把延迟属性声明为变量
class MySize{
var w:Int=0
var h:Int=0
}
class LazyClass {
lazy var size=MySize()
var sex:String = ""
}
let myLazy=LazyClass()
myLazy.sex="boy" //这个时候age还没有初始化
myLazy.size.h //这个时候才实例化
2.计算属性
计算属性是为了设置其他属性的值,而不是为了存储用
struct Point{
var x=0.0
var y=0.0
}
struct Size {
var width=0.0
var height=0.0
}
struct Frame {
var origin=Point()
var size=Size()
//定义计算属性
var center:Point{
get {
let centX=origin.x+size.width/2
let centY=origin.y+size.height/2
return Point(x: centX, y: centY)
}
set(newCent){
origin.x=newCent.x-size.width/2
origin.y=newCent.y-size.height/2
}
}
}
var square=Frame(origin: Point(x: 10, y: 10), size: Size(width: 100, height: 100))
let squareCent=square.center //获得中心点
square.center=Point(x: 150, y: 150) //设置中心点
如果只有get,没有set则为只读计算属性
3.属性观察器
属性观察期,顾名思义,当属性变化时会调用,当属性相同时也会调用;
除延迟属性之外都可以定义属性观察器;
观察器,属性初始化时不会被调用
属性观察器有:
willSet :设置之前
didSet :设置之后
class Bird{
var year:String="2014"{
willSet{
if(newValue==year){
print("Same")
}else{
print("not same to \(year)\n")
}
}
didSet{
print("didset over\n");
}
}
}
var newBird=Bird()
newBird.year="2015"
/*
打印结果:
not same to 2014
didset over
*/
全局变量和局部变量注意点:
全局的常量或变量都是延迟计算的,跟延迟存储属性相似,不同的地方在于,全局的常量或变量不需要标记lazy特性。
局部范围的常量或变量不会延迟计算。
4.类型属性
类型属性和object-c中得静态变量差不多,当然语法有些不同。
1、)定义类型属性:使用关键字static来定义值类型(枚举和结构体)的类型属性,关键字class来为类(class)定义类型属性。
2.)类型属性必须设置初始值
3.)对于值类型(指结构体和枚举)可以定义存储型和计算型类型属性,对于类(class)则只能定义计算型类型属性。
struct Dog {
static var age=2
static var ageCal:Int{
return age
}
}
var agec=Dog.ageCal
class Cat {
//定义类的类型属性
class var age:Int{
return 3
}
}
var catAge=Cat.age
联系客服