Swift中協議與泛型的應用

2021-08-30 17:52:52 字數 2058 閱讀 3066

1.方法的泛型

//泛型約束(冒號後邊跟class或者協議,傳入的引數somet和someu必須是遵循該協議或類---(naarray類,comparable協議))

func somefunction(somet: t, someu: u)

func compartwo( _ a:t,_ b:t) -> bool

與oc中的id有點類似,只是可以遵循協議或者指定型別

2.struct的泛型

struct stack

mutating func pop() -> element }

var stackofstrings = stack()

print("字串元素入棧: ")

stackofstrings.push("google")

stackofstrings.push("runoob")

print(stackofstrings.items);

let deletetos = stackofstrings.pop()

print("出棧元素: " + deletetos)

var stackofints = stack()

print("整數元素入棧: ")

stackofints.push(1)

stackofints.push(2)

print(stackofints.items);

(1)struct也可以使用泛型,當呼叫結構體的時候可以指定泛型的具體型別

//協議

protocol container

//通過索引值型別為 int 的下標檢索到容器中的每乙個元素

//下標指令碼是系統提供的可以對struct或者enum或者陣列等重寫的乙個屬性

subscript(i:int) -> itemtype

//不一定是一維的,也可以是二維的

// subscript(row: int, col: int) -> double

}//stack 遵循container協議, (element可以設定遵循某個協議)(這個協議可以寫在extension中的where裡)

struct stack:container

mutating func pop(item:element)

//協議部分

self.push(item: item)

}var count: int

subscript(i: int) ->element

}//where是對stack傳入的元素的型別約束,必須遵循可以進行等於比較的協議(傳入陣列就不行),其實也可以在stack定義的時候讓元素遵循某個協議,這個協議的範圍只是在呼叫這個擴充套件方法裡,上邊的push元素不遵循

extension stack where element:equatable

return topitem == item

}}

(2)呼叫stack

func one()
(3)寫乙個泛型遵循container協議的方法,正好上述stack遵循container協議,可以把aaa和bbb作為引數傳進去

func allitemsmatch(containter1:c1,containter2:c2) -> bool

where c1.itemtype == c2.itemtype, c1.itemtype:equatable

for i in 0..呼叫方法

if allitemsmatch(containter1: aaa, containter2: bbb) else

補充:

subscript是系統提供的,通常情況下,我們在使用陣列(array)或字典(dictionary)時會使用到下標。其實在swift中,我們還可以給類、結構、列舉等自定義下標(subscript)。

subscript例子:

整合的**加自己的理解,參考文章:

swift 協議泛型associatedtype

協議 中不支援這中方式寫泛型 需要使用associatedtype關鍵字 protocol container subscript i int itemtype 可以實現協議看下具體如何使用 from import uikit protocol container subscript i int i...

Swift 中的泛型

定義乙個交換兩個值得泛型函式 func swaptwovalues a inout t,b inout t var num1 11 var num2 22 swaptwovalues num1,num2 print num1 num1 num2 num2 var str1 11 var str2 2...

Swift之泛型型別與泛型引數

import foundation func swaptwoints inout a int,inout b int func swaptwostrings inout a string,inout b string func swaptwodoubles inout a double,inout ...