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...