優雅的使用UITableView(Swift 中)

2021-09-11 10:57:02 字數 3383 閱讀 3212

在優雅的使用uitableview(oc 上)中,已經給大家分享了怎麼使用uitableview,優雅的構建乙個頁面。

怎麼把優雅的使用uitableview(oc 上)的思路搬到swift

泛型any的區別

在swift中優雅的使用uitableview構建list頁面

再回憶一下這張圖

其中關鍵的點其實就是row,如果我們把row做好了,其實大功基本告成。

看看成果:

swift版的是不是更優雅了些?

struct

noneitem

{}protocol

updatable: class

extension

updatable

}protocol

rowtype

var reuseidentifier: string

var cellclass: anyclass

func

update

(cell: uitableviewcell)

func

cell

() -> c

func

cellitem

() -> m

}class

row where

cell: updatable, cell: uitableviewcell

func

cell

() -> c

return cell

}func

cellitem

() -> m

return cellitem

}private

var _cell: cell?

func

update

(cell: uitableviewcell)

}}extension

row: rowtype

{}public

class

rowtags

}public

class

rowtag: rowtags

}extension

rowtag: hashable

public

var hashvalue: int

}extension

rowtags

複製**

以上**,對比oc實現主要有三點不同:

不知道你對rowtype這個協議的存在是否感到疑惑,假如沒有它行不行?

如果沒有rowtype這個協議,這兩個row應該放在什麼型別的陣列裡呢?

你打算用any?那你的**裡肯定會出現一堆as?的**,顯然與我們談到的優雅背道而馳。

其實rowtype的存在就是這些元素的抽象,讓我們知道這些元素的共同屬性。

是不是典型的面相協議程式設計?

如果沒有怎麼接觸過swift的同學,或者不太了解泛型的同學,看到上面的語法,肯定是一臉的懵逼。

在這裡簡單給不太了解的同學普及一下。

泛型,泛型,從字面理解就是廣泛的型別嘛,就是各種姿勢都滿足,但是他和any有什麼不同呢?

我們先來看這麼乙個需求,我想寫乙個max函式,他要使用各種型別,如果沒有接觸過泛型的同學寫出來的函式應該是這樣(請只看方法定義)

func

anymax

(_ x: any, _ y: any)

-> any

複製**

如果對於oc那樣指標操作的語言這似乎沒有問題,但是這對於swift這樣的強型別語言就很有問題了。

為什麼?

假如我比較兩個int型別的數字,返回的是any,這顯然不是我想要的

let n = 1

let m = 2

// result 的型別會為any

let result = anymax(n, m)

複製**

再看泛型版本

func

genericmax

(_ x: t, _ y: t)

-> t

複製**

let n = 1

let m = 2

// result 的型別會為int

let result = genericmax(n, m)

複製**

因為swift有型別推斷,所以我們在輸入值比較時就知道了我們的result型別為int

any會造成型別丟失

where關鍵字表示約束條件,t必須為遵循了協議comparable的型別

再看一遍這張圖

這有三組樣式的uitableview

其實listdetail維護的東西是一樣的,就是那個rowcontainer

核心**

在此oc和swift的優雅使用uitabelview都已經和大家介紹完畢了。

下一節會和大家分享一下在我開發中,對detail介面的運用和list介面的運用,以及怎麼用泛型去對detail模型和list模型的解析。

在上一節中,有很多同學給我推薦了一些表單的庫,其實我自己也知道有很多優秀的表單庫,列如eureka、xlform等等。

那麼,我為什麼還要自己造輪子?

兩個主要的原因:

其實我也只是站在了大佬的肩上而已

func

buttonaction

(_ sender: uibutton)

複製**

其實為nil,在我開發時,我是知道的,但我錯誤的理解為,系統會在執行時再去拿那個target。

為nil的原因其實是button還沒有新增在superview上,響應鏈還找不到他的uiviewcontoller。

那麼既然,target沒有被系統持有,那麼,為什麼事件還能相應?

,而我之前的實現,又恰好在vc中實現了,所以方法會被呼叫。

優雅的使用python

優雅的使用python,讓自己的code更pythonic test list 龍母 雪諾 提里昂 山姆 count 0 for name in test list print s的序號是 d name,count count 1龍母的序號是 0 雪諾的序號是 1 提里昂的序號是 2 山姆的序號是 ...

優雅的使用git

git config global user.name git config global user.email com 2.對於git遠端庫的訪問有兩種訪問協議,一種是https協議。另一種是ssh協議。當我們使用https協議的時候,當我們進行拉取或者推送的時候會提示我們輸入使用者名稱和密碼。另...

優雅的使用if else

簡單的if else if 還好,就怕if else if 的裡面給你整個俄羅斯套娃。畫面太美 判斷書本狀態 private void testif string status else if done equals status else if read equals status 等到上面的場景...