1、只能在類和結構體中存儲常量和變量
struct Location{ //描述位置的結構體
var x:Double
let y:Double
}
var position1 = Location(x:22.22,y:33.33)//變量
position1.x = 20//變量存儲屬性可以修改
position.y = 30//錯誤卫袒,常量存儲屬性不可修改
let position2 = Location(x:20.2,y:30.3)//結構體實例賦值給一個常量
position2.x = 22.22//錯誤改淑,這時變量屬性也是不可修改
//原因:這是因為結構體屬于值類型揣苏,當值類型被聲明為常量的時候捐晶,其所有屬性也就成了常量
class Address{//描述地址的類
let city = "Hangzhou"
var town:String ?
}
let address1 = Address()//將一個實例賦值給一個常量
address1.town = "cangqian"http://其變量屬性仍然可變
//而當把一個引用類型賦值給一個常量的時候谎砾,仍可以修改該實例的變量屬性
2樟插、延遲加載存儲屬性關鍵詞lazy
class Data{
var fileName = "data.plist"
//此處是比較耗時的數(shù)據(jù)加載工作
}
class DataManger{
lazy var data = Data()//使用lazy第一次訪問的時候才被創(chuàng)建
// 對數(shù)據(jù)操作// lazy延時加載只能修飾變量韵洋,因為常量需要初始化值
}
let manager = DataManger()//創(chuàng)建實例的時候并沒有創(chuàng)建data實例
manager.data//此時才回去執(zhí)行耗時的數(shù)據(jù)加載工作
//如果lazy修飾的屬性沒有被初始化就被多個線程訪問,就會被初始化多次
3黄锤、計算屬性:可用于類搪缨、結構體、枚舉鸵熟,不直接存儲值副编,而是提供一個set和get方法
struct Size{
var width = 0.0
var height:Double{
get{
print("get")
return 10.0
}
set{
width = 20.0
print("set")
}
}
}
var size1 = Size()
size.height = 17 // 設置height值時調(diào)用set方法
print(size1.width)//20.0
print(size1.height)//10.0
4、只讀屬性:只有get方法流强,沒有set方法的屬性
struct Cuboid{
var width = 0.0 ,height = 0.0, depth = 0.0
var volume: Double{//必須用var修飾痹届,計算屬性值是不固定的
return widthheightdepth
}
}
let fourByFiveByTwo = Cuboid(width:4.0,height:5.0,depth:2.0)
print(fourByFiveByTwo.volume)//40.0可以通過點語法訪問
fourByFiveByTwo.volume = 20.0//不能設置新值呻待,錯誤
5、屬性觀察器队腐,willSet蚕捉,didSet;只要為屬性設置新值就回調(diào)用屬性觀察器
class StepCounter{
var totalSteps: Int = 0 {//一定要設置初始值
willSet{ // willSet在新值被設置之前調(diào)用
print(newValue) //newValue為默認參數(shù)名稱
}
didSet(oldSteps){//didSet 在新值被設置之后調(diào)用
print(olsSteps)//修改默認參數(shù)oldValue為oldSteps
}
//willSet會將心得屬性值傳入newValue參數(shù)柴淘,didSet會將舊的屬性傳入oldSteps
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 23 //newValue:23 oldSteps:0
stepCounter.totalSteps = 5 //newValue:5 oldSteps:23
6迫淹、類型屬性
//實例屬性:每創(chuàng)建一個實例,該實例都會擁有一套屬于自己的值为严,實例之間的屬性相互獨立
//類型屬性:為類型定義屬性時敛熬,無論創(chuàng)建多少個該類型的實例,該屬性都只有唯一一份
struct someStruct{
static var typeProperty = "value" //用static定義類型屬性
}
class someClass{
static var typeProperty = "value"
static var computedTypeproperty: Int{
return 6 //可以通過閉包返回屬性值
}
}
print(someStruct.typeProperty) //Value,類型屬性直接通過其本身來訪問
someStruct.typeProperty = "Another value"http://typeProperty為var類型第股,可寫
print(someStruct.typeProperty) //Another value
print(someClass. computedTypeproperty) //6