Swift語言學習筆記(四)

2021-07-25 19:09:25 字數 3887 閱讀 7715



67.如果結構體(

struct

)的例項被宣告為常量的話,就不能對其屬性進行修改,即使是

var型別的屬性。而對於類(

class

)來說則不是這樣,如果乙個類的例項被宣告為常量,仍然可以修改其

var屬性。

68.惰性屬性(

lazy property

),使用關鍵字

@lazy

(新增在宣告前面),惰性屬性在使用時才會進行初始化,在宣告時一定要將惰性屬性宣告為

var型別,因為常量屬性在初始化函式執行前之前必須要進行初始化賦值。惰性屬性可以用於那種需要等所有的初始化工作都執行完了才能進行初始化的屬性,也可以針對那些需要複雜的初始化過程,或者初始化過程非常耗時的屬性來設定,例如:

class verylargeandcomplexclass

class democlass

69.在

swift

中,沒有屬性(

property

)和字段(

field

)之分,所有的成員都統一為屬性,用來儲存屬性的內容的變數不可訪問,只能通過屬性來對其操作。

70.同樣,swift

中可以為屬性定義訪問器

getter

和setter

,例如:

var description : string

set (newdescription) }}

上面的set方法如果省略掉(newdescription)的定義,預設swift會生成乙個newvalue作為要賦的值的名字,所以,上面的set方法也可以簡寫為:

set

}如果只定義get,不定義set方法,則屬性為唯讀的。唯讀屬性可以省略get關鍵字,例如:

var description : string

71.屬性觀察器用來對屬性的賦值操作進行處理,除了惰性屬性之外,你可以為任何屬性新增觀察器。可以為屬性新增

willset

和didset

兩個觀察器,

willset

在屬性賦值前被觸發,

didset

在屬性賦值後被觸發,在屬性第一次賦值,即初始化的時候,

willset

和didset

不會觸發。

willset

和didset

方法與set

方法一樣,允許用圓括號定義乙個值的名稱,當省略圓括號和自定義的名稱時,對於

willset

方法,會使用

newvalue

作為預設名稱,對於

didset

,會使用

oldvalue

作為預設名稱。下面是個具體的例子:

class demo

didset }}

如果定義了willset和didset方法,就不必寫get和set方法了,否則會有編譯錯誤。

72.除了屬性,全域性變數和區域性變數也可以定義

get、

set、

willset

和didset

方法。

73.swift

中的靜態變數(或者說型別變數)的定義對於類(

class

)、列舉型別和結構體是有區別的(前者是引用型別,後兩種是值型別)。對於類來說,定義的時候使用

class

關鍵字來修飾,對於列舉型別和結構體,定義的時候使用

static

關鍵字。此外,對於列舉型別和結構體,在定義靜態變數上沒有限制,而類中的靜態變數必須為計算型別變數(具有

get、

set等方法的變數)。例如:

struct demostruct

}enum demoenum

}class democlass

}74.

swift

中的方法(類、結構體、列舉中定義的函式)和函式在語法上沒有區別,但是對於帶引數的方法來說,第乙個引數的定義是正常的,第二個引數以及後面的其他引數,他們的外部名稱和內部名稱相同,預設

swift

就已經定義好了,也就是相當於

swift

替我們在除了第乙個引數以外的其他引數定義上都加上了「

#」符號。這種用法是按照

object-c

的編寫習慣來設計的。例如:

class democlass

}var cls = democlass()

cls.demofunc(1, p2: "abc")

如果我們不希望swift這種預設的處理方式,想要不使用外部名稱來呼叫的話,只需要在想要處理的引數的外部名稱的位置顯式地使用下劃線「_」來代替外部名稱即可:

class democlass

}var cls = democlass()

cls.demofunc(1, "abc")

75.結構體、列舉型別為值型別,因此在其中定義的方法不能夠修改結構體和列舉型別的自身屬性,如果確實想要這麼做,可以在方法定義前面新增

mutating

關鍵字來修飾。但是如果結構體或者列舉型別的例項被定義為常量的話,新增

mutating

關鍵字也不能修改其屬性。此外,在

mutating

關鍵字修飾的方法中,還可以為

self

賦值。

76.mutating

關鍵字、方法、

self

在列舉型別中的應用:

enum level }}

var lvl = level.level1

lvl.turntonextlevel()

//lvl

現在變成

level2了

77.swift

中的靜態方法(或者說型別方法)和靜態屬性的定義類似,對於類中的靜態方法,在

func

關鍵字前面加上

class

關鍵字,對於列舉型別或者結構體等值型別,在

func

關鍵字前面加上

static

關鍵字修飾。與其他語言不通,

swift

在靜態方法中仍然可以使用

self

關鍵字,只不過此時

self

關鍵字指的是類本身而不是某個例項,因此可以通過

self

關鍵字來引用靜態屬性。

78.在swift

中可以為類、結構體和列舉型別定義下標(

subscript

),下標的用法類似於陣列和字典中下標的用法,下標定義使用

subscript

關鍵字,例如:

struct twodimentionarray

subscript(i : int,j : int) -> int

set (newvalue)

}func showelements()

}var twodarray = twodimentionarray(height: 3, width: 6)

twodarray.showelements()

twodarray[2, 6] = 10

twodarray.showelements()

上面**中使用一維陣列來模擬乙個二維陣列。從**中可以看到,下標中使用get和set來定義讀寫方法。

如果只定義get方法,則下標的為唯讀的,此時可以省略get關鍵字和它的花括號。set方法可以省略newvalue引數和它的圓括號,swift缺省會生成乙個名叫newvalue的預設引數(這部分用法和get、set用法一樣)。下標的引數不一定非要是int型別,可以使任何型別的,也可以使用引數列表,但是不能使用inout引數或者設定引數預設值。

乙個類或者結構體可以定義很多個下標定義。

79.swift

中使用init

來定義初始化方法。

Swift語言學習筆記(4)

public class somepublicclass internal class someinternalclass fileprivate class somefileprivateclass private class someprivateclass 常量,變數,函式的訪問級別 publ...

c語言學習筆記四

結構體 復合型別和結構體 復合型別 示例 struct test sturuct 如果用這種復合型別來定義變數 示例 struct test stuructz1,z2 定義訪問結構體 include int main void z int x 3 z.x x z.y 4 printf z f f z...

c語言學習筆記四

結構體 復合型別和結構體 復合型別 示例 struct test sturuct 如果用這種復合型別來定義變數 示例 struct test stuructz1,z2 定義訪問結構體 include int main void z int x 3 z.x x z.y 4 printf z f f z...