先看呼叫效果:「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 能擴充套件協議 協議可以新增方法和屬性 協議擴充套件...