Swift快速為類擴充套件屬性

2021-09-14 03:03:13 字數 1904 閱讀 7577

在程式編寫過程中,我們常常需要為已有的類擴充套件新的屬性。通常我們的解決辦法是先宣告乙個key,然後使用objc_getassociatedobjectobjc_setassociatedobject來設定屬性。相對來說比較麻煩,因為擴充套件屬性的需求比較大,所以筆者對這兩個方法做了一些封裝,減少了很多**。
首先我們來看看封裝後如何使用。

extension view:property

set}

}

是不是非常簡單?不過在使用這個property之前,一定要看清楚注意事項哦。

property裡面預設封裝了設定三個屬性的方法。

擴充套件前三個屬性的時候分別是 get0() & set0()、get1() & set1()、get2() & set2()

那麼超過三個屬性應該如何設定呢?

var test : string

set}

也還是比較簡單的,畢竟為乙個類擴充套件超過三個以上的屬性的需求還是比較小的。

首先我們看看,擴充套件屬性通常使用的**

struct xkeys 

extension abstractprotocol

set}

在複製貼上了多次這樣的**之後,我實在厭倦了這樣擴充套件屬性的方式,然後開始了自己的封裝。

首先我發現宣告乙個key之後,可以給多個類共用,沒有任何影響,但是如果同乙個類的不同屬性,使用了相同的key,就會有問題了。所以首先要保證同乙個類,擴充套件出來的不同屬性的key值必須要不同。

所以我想到用乙個陣列來儲存key,不過很可惜失敗了。

最開始封裝property的時候是直接宣告了乙個類,寫了一些靜態方法。然後在get set中呼叫。

class property2 

static func set(_ key: unsaferawpointer,_ newvalue : t)

}

不過測試過程中發現一些問題,這個self實際應該使用被擴充套件的物件的類的self,所以經過修改後,**如下:

class property2 

static func set(_ o : any, _ key: unsaferawpointer,_ newvalue : t)

}

呼叫的時候:

var common : string

set}

感覺封裝了跟沒封裝基本差不多啊。

有沒有辦法能省略property和self呢,於是我想到了protocol,然後讓類去繼承我的property,這樣就可以省略掉這兩項了。不過key還是要傳遞,所以我預設宣告了三個key,再提供乙個需要傳遞key的方法。最後封裝好的**為:

//  property.swift

//// created by fancy on 26/1/18.

import uikit

struct propertykey

protocol property{}

extension property

func set(_ key: unsaferawpointer,_ newvalue : t)

func get0() -> t

func set0(_ newvalue : t)

func get1() -> t

func set1(_ newvalue : t)

func get2() -> t

func set2(_ newvalue : t)

}

整個封裝過程沒有什麼高科技含量的操作,寫文章做點記錄,希望能給到需要的人幫助。

Swift 類擴充套件(extension)

playground noun a place where people can play import uikit var str hello,playground swift語言的類擴充套件是乙個強大的工具,我們可以通過類擴充套件完成如下事情 1.給已有的類新增計算屬性和計算靜態屬性 2.定義新...

Swift 類與屬性

1.建立乙個類 class是swift中的關鍵字,用於定義類 class 類名 繼承的類 例如 類名 learningclass 父類 uiviewcontroller class learningclass uiviewcontroller 2.類可以新增屬性方法 通常分為多種 儲存屬性 儲存事例...

swift 類和結構體(之屬性)

值型別和引用型別中可以通過外部訪問的成員 除了方法外 都叫做屬性。swift中到底存在多少種屬性?1.儲存屬性 類和結構體的成員變數或者成員常量都屬於儲存屬性。struct fixedlengthrange 建立結構體物件,並初始化結構體中屬性 var rangeofthreeitems fixed...