詳解Swift中屬性的宣告與作用

2022-09-20 22:03:12 字數 2708 閱讀 8121

一、引言

屬性將值與類,結構體,列舉進行關聯。swift中的屬性分為儲存屬性和計算屬性兩種,儲存屬性用於儲存乙個值,其只能用於類與結構體,計算屬性用於計算乙個值,其可以用於類,結構體和列舉。

二、儲存屬性

儲存屬性使用變數或者常量來儲存乙個值,在宣告儲存屬性時,可以為其設定乙個預設值,也可以在構造示例是進行值的設定,屬性可以通過點語法來訪問,結構體的儲存屬性示例**如下:

struct mystruct

var obj = mystruct(property1: 1, property2: 2)

//通過點語法進行屬性的訪問

print(obj.property1,obj.property2)

如上結構體,如果有屬性被宣告成let常量,則此屬性不能夠被修改。還有一點需要注意,如果在建立結構體的例項時,使用的是let進行建立,則即便結構體中的屬性是變數也不可進行修改。這和類有很大區別。

還有一類儲存屬性叫做延時儲存屬性,可以設想一下這樣的情形,類的某些屬性可能並不是在每次類例項後都會用到,並且有些屬性的構造可能會消耗大量的時間,這時乙個比較聰明的設計便是在類進行例項化時,這類屬性並不被構造,當次類的例項使用到這個屬性時,這個屬性才被構造出來,這樣的屬性被稱為延時儲存屬性,使用lazy關鍵字來宣告,示例如下:

//第乙個類

class myclass1

}class myclass2

//在構造myclass2時 並不會進行body屬性的構造 不會有列印資訊

var obj2 = myclass2()

//執行下面**後 會有列印資訊 使用body屬性使得body被構造

obj2.body

注意,如果在多個執行緒中對延時構造屬性進行使用,不能保證其只被構造一次。

三、計算屬性

簡單的理解,計算屬性並不是獨立的用於儲存值的屬性,開發者甚至可以將其理解為乙個計算方法,其主要用於通過計算來獲取或者設定其他儲存屬性的值。示例如下:

struct circle

set}}

var circle = circle(center: (0,0), r: 2)

print(circle.l)

circle.l=24

print(circle.r)

通過上面的演示**可以了解,l屬性並非是乙個新的屬性,只是通過r屬性來計算出l,或者通過l來反推出r,其中有一點需要注意,計算屬性中可以建立兩個**塊set和get,set**塊是可選的,其中會預設生成乙個newvalue引數來傳遞外界傳進來的資料,get**塊是必須要實現的,當然也可以只實現get**塊,這時這個屬性將是唯讀的計算屬性,只可以獲取,不能夠設定。還有一點需要注意,開發者也可以在set**塊後面自定義xpkpxgyw乙個引數名來接收外界傳入的引數,示例如下:

struct circle

set(newl)

}}唯讀的計算屬性可以進行進一步的簡寫,因為沒有了set**塊,所以關鍵字get和括號也可以給省略掉,不會產生歧義,示例如下:

struct point

}四、屬性***

swift中的計算屬性中的get和set方法和objective-c中的get和set方法其實並非是一回事,objective-c提供set和get方法可以讓開發者在屬性將要獲取或者設定的時候來進行一些自定義的操作,這部分的開發需求在swift中通過屬性***來實現。

屬性***有willset和didset兩種,willset在屬性值將要變化時執行,didset在屬性值已經變化時執行,並且其中會傳入變化前後的值。示例如下:

struct point

didset

} var center:(double,double)

}var point = point(x: 3, y: 3)

//將列印

/* 將要進行值的更新設定,新的值是: 4.0

已經進行值得更新設定,舊的值是: 3.0

*/point.y=4

willset中缺省會生成乙個命名為newvalue的引數,didset中會預設生成乙個命名為oldvalue的引數,也可以自定義這些引數的命名,示例如下:

struct point

xpkpxgywdidset(old)

} var center:(double,double)

}五、例項屬性與型別屬性

例項屬性是針對與乙個型別的例項,型別屬性則是直接針對與型別。  每對型別進行一次例項化,其實例都有一套獨立的例項屬性,而型別屬性則是類的所有例項所共用的,在objective-c中,通常使用全域性的屬性來實現這樣的效果,在swift中,使用static關鍵字來宣告型別屬性,示例如下:

struct point

var x:double

var y:double

didset(old)

} var center:(double,double)

}//型別屬性 通過型別點語法來獲取

print(point.name,point.subname)

注意,有一種特殊的情況是針對於類的型別計算屬性,如果其需要子類進行繼承重寫,需要將static關鍵字,換成class關鍵字,示例如下:

class someclass

//支援子類進行重寫的計算屬性

class var overrideablecomputedtypeproperty: int

}本文標題: 詳解swift中屬性的宣告與作用

本文位址: /ruanjian/swift/155328.html

PHP中的函式宣告與使用詳解

函式 1.函式名是識別符號之一,只能有字母數字下劃線,開頭不能是數字 函式名的命名,必須符合 小駝峰法則 func func func 函式名不區分大小寫 函式名不能與已有函式同名,不能與內建函式名同名 2.function exists func 用於檢測函式是否已經宣告 注意傳入的函式名,必須是...

html屬性與文件的宣告

可以通過屬性來設定標籤 來處理標籤中的內容 屬性需要寫在開始標籤中,實際上就是乙個名值對的結構 名值對 屬性名 乙個標籤中可以設定多個屬性中間用空格隔開 e 這是乙個屬性font h1 查詢文件 1scem0ek3wxe9mc1duof9wa 提取碼 81fv doctype html總共有那麼多的...

Swift中屬性(Property)的分類

在swift的學習過程中,我發現理解屬性,對後續學習類 class 列舉 enumeration 和協議 protocol 很有幫助,現在總結一下swift中屬性的分類,主要分為四大類 儲存例項屬性 stored instance property 儲存在例項的記憶體中的屬性,只有乙份 計算例項屬性...