swift 類和結構體(之屬性)

2021-07-11 10:50:14 字數 3839 閱讀 5069

值型別和引用型別中可以通過外部訪問的成員(除了方法外)都叫做屬性。

swift中到底存在多少種屬性?

1.儲存屬性

類和結構體的成員變數或者成員常量都屬於儲存屬性。

struct fixedlengthrange

//建立結構體物件,並初始化結構體中屬性

var rangeofthreeitems = fixedlengthrange(firstvalue:0,length:3)

rangeofthreeitems.firstvalue = 6

println(rangeofthreeitems.firstvalue)

letrangeofthreeitems = fixedlengthrange(firstvalue:0,length:3)

rangeofthreeitems.firstvalue = 6//this is wrong.

println(rangeofthreeitems.firstvalue) 

class newproduct

var newproduct = newproduct()

println(newproduct.name)

注意:所有值型別的常量,其內部所有的成員也同樣不可修改。例如,前面**中如果將var rangeofthreeitems 寫成 let rangeofthreeitems ,即使fixedlengthrange中有變數,也不可以修改變數值。

2.惰性儲存屬性

只有在第一次訪問該屬性時才進行初始化。主要是在處理非常消耗資源的初始化工作時非常擁有,只有需要消耗這些資源時才消耗。

class dataimporter }

class datamanager

let manager = datamanager()

manager.data += "some data"

manager.data += "some more data"

println(manager.data)

//現在dataimporter.process 方法還沒有被呼叫

println(datamanager().importer)//此處用到datamanager().importer,實行了懶屬性的懶載入

輸出如下內容:

1. [some data,some more data]

2.process 3.

data.txt

而如果去掉lazy,輸出如下內容:

1.    

process

2.    

[some data,some more data]

3.    

process

4.    

data.txt

3.可讀寫的計算屬性 (get 、set)

struct point

struct size

struct rect

set(mycenter)

}}

4.唯讀計算屬性

如果將計算屬性中的set去掉,則該屬性為唯讀計算屬性,只能獲取該屬性的值,不能設定屬性的值。(不可加get、set關鍵字,否則不為唯讀屬性)

struct cuboid}

5.屬性觀察器

當設定屬性相關。當設定屬性之前,會呼叫willset觀察器,並將新設定的屬性值傳入willset觀察器。設定完屬性後,又會呼叫didset觀察器,並將就該屬性舊的值傳入didset觀察器。

class stepcounter

didset(myoldvalue)}}

let stepcounter = stepcounter()

stepcounter.totalsteps = 200 

stepcounter.totalsteps = 360

stepcounter.totalsteps = 896

new value is 200

old value is 0

new value is 360

old value is 200

new value is 896

old value is 360

如果不在willset 和didset 後面的圓括號中指定引數名,則willset 中預設的引數名是newvalue,didset中預設的引數名是oldvalue。

class stepcounter

didset }

}注意:willset 和 didset 不能和 set、get 一起使用,這一點使用時要注意。

全域性變數也可以使用:

var totalsteps: int = 0{

willset(newtotalsteps){

print("new value is \(newtotalsteps)")

didset(myoldvalue){

print("old value is \(myoldvalue)")

totalsteps = 123

var origin = point(x:200,y:200)

var size = size()

//全域性計算變數

var center:point{

get{

let centerx = origin.x +(size.width /2)

let centery = origin.y + (size.height / 2)

return point(x:centerx,y : centery)

set(mycenter){

origin.x = mycenter.x-(size.width/2)

origin.y = mycenter.y-(size.height/2)

print("x=\(center.x),y=\(center.y)")

輸出內容如下:

new value is 123

old value is 0

x=200.0,y=200.0

5.靜態屬性

靜態計算屬性不需要建立物件,可以直接從類、結構體和列舉型別中引用。用該型別建立的物件共享乙個表態屬性。結構體和杖舉型別使用static宣告表態屬性,而類需要使用class宣告表態屬性。

struct mystructure{

//靜態計算屬性

static var computedtypeproperty:string{

return "hello world"

static var typeproperty:int = 20

enum myenumeration{

static var storedtypeproperty = "some value."

//靜態計算屬性

static var computedtypeproperty:int{

get{

return 200

class myclass{

//靜態計算屬性

class var computedtypeproperty:int{

return 123

class myclass{

//靜態計算屬性

class var computedtypeproperty:int{

return 123

print(myclass.computedtypeproperty)

print(myenumeration.computedtypeproperty)

print(mystructure.typeproperty)

結果:

Swift 類和結構體

swift 中類和結構體的共同點 1.定義屬性用於儲存值 2.定義方法用於提供功能 3.定義下標用於訪問值 4.定義構造器用於生成初始化值 5.通過擴充套件以增加預設實現的功能 6.符合協議以對某類提供標準功能 class 不同於 struct 的特點 1.允許乙個類繼承另乙個類的特徵 2.型別轉換...

Swift 結構體和類

結構體 swift結構體也具有封裝的概念 swift結構體比oc c語言裡面的結構體更加進了一步,裡面可以有方法,更接近我們的類 結構體的定義格式 struct結構體名 struct rect var width double 按構造方法賦初值 var height double 方法 func g...

Swift 類和結構體(class struct)

較傳統的oc語言,swift使用了更多的結構體 在 swift 中,所有的基本型別 整數 integer 浮點數 floating point 布林值 boolean 字串 string 陣列 array 和字典 dictionary 都是結構體型別 所以只有熟悉類和結構體各自的特性,才能編寫出更優...