Swift 優雅的協議擴充套件

2021-09-25 09:08:41 字數 3510 閱讀 8481

先看呼叫效果:「123456」.yy_str.md5forlower32bate()

"123456"

.yy_str.

md5forlower32bate()

//類似:view.snp.***

為什麼要這麼做呢?好處在哪呢?

降低耦合度:傳統的寫法,直接在類別中新增乙個方法或屬性例如:

extension

string

|\\d)(\\d|[xx])$"

let idtest:

nspredicate

=nspredicate

(format:

"self matches %@"

, idregex)

return idtest.

evaluate

(with:

self)}

}

降低不必要的衝突:當另乙個工程師也有類似的需求時,他也新建檔案寫啦同樣的方法,這就會有衝突,然後排查…

只需要乙個屬性,就能實現想要的擴充套件功能,**簡潔

定義協議:yprotocolextension.swift

//協議擴充套件

protocol

yextensionprotocol

}

定義乙個實現該協議的結構體

struct

yextensionkitstructtypeencodable

:yextensionprotocol

}

同樣我們也可以直接指定型別

struct

yextensionstringencodable

:yextensionprotocol

}

擴充套件yextensionprotocol,實現相關string中md5加密的功能

注意:凡是協議中定義的函式自己在協議中實現啦,他就是可選的型別,反之,是繼承協議著必須實現。

string為例:md5加密

import

commoncrypto

//mark:string-md5加密32位

//where yextensiontype == string 指定yextensiontype:為那種型別

extension

yextensionprotocol

where

yextensiontype

==string

result.

deinitialize

(count

: digestlen)

return

string

(hash)

}///md5加密32位大寫

func

md5forupper32bate()

->

string

result.

deinitialize

(count

: digestlen)

return

string

(hash)

}}

給string新增擴充套件:新增屬性

//markl:有關字串的擴充套件

extension

string

///第二種:泛型傳遞

var yy_kit:

yextensionkitstructtypeencodable

<

string

>

}

在viewcontroller測試結果如下

override

func

viewdidload()

// 輸出結果如下:

e10adc3949ba59abbe56e057f20f883e

e10adc3949ba59abbe56e057f20f883e

——————————————————————————————————

e10adc3949ba59abbe56e057f20f883e

e10adc3949ba59abbe56e057f20f883e

//

// yextensionprotocol.swift

// yextentiondemo

//// created by bruce yao on 2019/7/18.

//import

foundation

import

uikit

import

commoncrypto

//協議擴充套件

protocol

yextensionprotocol

}///struct型別的擴充套件基礎

struct

yextensionkitstructtypeencodable

:yextensionprotocol

}struct

yextensionstringencodable

:yextensionprotocol

}/class型別的擴充套件基礎

//final class yextensionkitclasstypeencodable: yextensionprotocol

//}//mark:string-md5加密32位

extension

yextensionprotocol

where

yextensiontype

==string

result.

deinitialize

(count

: digestlen)

return

string

(hash)

}///md5加密32位大寫

func

md5forupper32bate()

->

string

result.

deinitialize

(count

: digestlen)

return

string

(hash)}}

//mark:有關字串的擴充套件

extension

string

var yy_kit:

yextensionkitstructtypeencodable

<

string

>

}

source ''

platform :ios

,'9.0'

target 'targetname'

dopod 'yyextentions'

,end

swift 協議和擴充套件

在擴充套件裡新增協議遵循 你可以擴充套件乙個已經穿在的型別來採納和遵循乙個新的協議,舊算時你無法訪問現有的型別的源 也行,擴充套件可以新增新的屬性 方法 和下標到已經存在的型別。並且因此允許你新增協議需要的任何結果 from import uikit protocol textrepresentab...

swift繼承 多型 擴充套件 協議

swift的繼承是單一繼承。class classname superclass 方法多型 class baseclass class superclass 屬性多型 通過繼承屬性 你可以改變 get和set class baseclass class superclass 禁止多型 將整個類標識為...

Swift 面向協議程式設計之協議擴充套件

協議的命名遵循swift的標準庫,即協議名以 type able ible 結尾。例如 sequencetype,generatortype,customstringcoveeertible,type定義行為,able定義元素怎樣做事。swift 能擴充套件協議 協議可以新增方法和屬性 協議擴充套件...