版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】怎么在iOS中實現(xiàn)多繼承與多重代理
本篇文章給大家分享的是有關怎么在iOS中實現(xiàn)多繼承與多重代理,在下覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著在下一起來看看吧。1.多繼承1.實現(xiàn)過程swift中的類可以遵守多個協(xié)議,但是只可以繼承一個類,而值類型(結構體和枚舉)只能遵守單個或多個協(xié)議,不能做繼承操作.多繼承的實現(xiàn):協(xié)議的方法可以在該協(xié)議的extension中實現(xiàn)protocol
Behavior
{
func
run()
}
extension
Behavior
{
func
run()
{
print("Running...")
}
}
struct
Dog:
Behavior
{}
let
myDog
=
Dog()
myDog.run()
//
Running...無論是結構體還是類還是枚舉都可以遵守多個協(xié)議,所以要實現(xiàn)多繼承,無非就是多遵守幾個協(xié)議的問題.下面舉個例子.2.通過多繼承為UIView擴展方法//
MARK:
-
閃爍功能
protocol
Blinkable
{
func
blink()
}
extension
Blinkable
where
Self:
UIView
{
func
blink()
{
alpha
=
1
UIView.animate(
withDuration:
0.5,
delay:
0.25,
options:
[.repeat,
.autoreverse],
animations:
{
self.alpha
=
0
})
}
}
//
MARK:
-
放大和縮小
protocol
Scalable
{
func
scale()
}
extension
Scalable
where
Self:
UIView
{
func
scale()
{
transform
=
.identity
UIView.animate(
withDuration:
0.5,
delay:
0.25,
options:
[.repeat,
.autoreverse],
animations:
{
self.transform
=
CGAffineTransform(scaleX:
1.5,
y:
1.5)
})
}
}
//
MARK:
-
添加圓角
protocol
CornersRoundable
{
func
roundCorners()
}
extension
CornersRoundable
where
Self:
UIView
{
func
roundCorners()
{
layer.cornerRadius
=
bounds.width
*
0.1
layer.masksToBounds
=
true
}
}
extension
UIView:
Scalable,
Blinkable,
CornersRoundable
{}
cyanView.blink()
cyanView.scale()
cyanView.roundCorners()這樣,如果我們自定義了其他View,只需要放大和縮小效果,遵守Scalable協(xié)議就可以啦!3.多繼承鉆石問題(DiamondProblem),及解決辦法請看下面代碼protocol
ProtocolA
{
func
method()
}
extension
ProtocolA
{
func
method()
{
print("Method
from
ProtocolA")
}
}
protocol
ProtocolB
{
func
method()
}
extension
ProtocolB
{
func
method()
{
print("Method
from
ProtocolB")
}
}
class
MyClass:
ProtocolA,
ProtocolB
{}此時ProtocolA和ProtocolB都有一個默認的實現(xiàn)方法method(),由于編譯器不知道繼承過來的method()方法是哪個,就會報錯.?鉆石問題DiamondProblem,當某一個類或值類型在繼承圖譜中有多條路徑時就會發(fā)生.解決方法:1.在目標值類型或類中重寫那個發(fā)生沖突的方法method().2.直接修改協(xié)議中重復的方法.文章開頭我們提到的問題2,我們可以試著用多重代理去解決這個問題.2.多重代理1.多重代理的實現(xiàn)過程我們以一個代理的經(jīng)典問題來表述:主人叫寵物們?nèi)コ燥?吃這個動作作為一個協(xié)議,我們要做到統(tǒng)一管理.1.定義協(xié)議protocol
MasterOrderDelegate:
class
{
func
toEat(_
food:
String)
}2.定義一個類:用來管理遵守協(xié)議的類這邊用了NSHashTable來存儲遵守協(xié)議的類,NSHashTable和NSSet類似,但又有所不同,總的來說有這幾個特點:1.NSHashTable中的元素可以通過Hashable協(xié)議來判斷是否相等.2.NSHashTable中的元素如果是弱引用,對象銷毀后會被移除,可以避免循環(huán)引用.class
masterOrderDelegateManager
:
MasterOrderDelegate
{
private
let
multiDelegate:
NSHashTable<AnyObject>
=
NSHashTable.weakObjects()
init(_
delegates:
[MasterOrderDelegate])
{
delegates.forEach(multiDelegate.add)
}
//
協(xié)議中的方法,可以有多個
func
toEat(_
food:
String)
{
invoke
{
$0.toEat(food)
}
}
//
添加遵守協(xié)議的類
func
add(_
delegate:
MasterOrderDelegate)
{
multiDelegate.add(delegate)
}
//
刪除指定遵守協(xié)議的類
func
remove(_
delegateToRemove:
MasterOrderDelegate)
{
invoke
{
if
$0
===
delegateToRemove
as
AnyObject
{
multiDelegate.remove($0)
}
}
}
//
刪除所有遵守協(xié)議的類
func
removeAll()
{
multiDelegate.removeAllObjects()
}
//
遍歷所有遵守協(xié)議的類
private
func
invoke(_
invocation:
(MasterOrderDelegate)
->
Void)
{
for
delegate
in
multiDelegate.allObjects.reversed()
{
invocation(delegate
as!
MasterOrderDelegate)
}
}
}3.其余部分class
Master
{
weak
var
delegate:
MasterOrderDelegate?
func
orderToEat()
{
delegate?.toEat("meat")
}
}
class
Dog
{}
extension
Dog:
MasterOrderDelegate
{
func
toEat(_
food:
String)
{
print("\(type(of:
self))
is
eating
\(food)")
}
}
class
Cat
{}
extension
Cat:
MasterOrderDelegate
{
func
toEat(_
food:
String)
{
print("\(type(of:
self))
is
eating
\(food)")
}
}
let
cat
=
Cat()
let
dog
=
Dog()
let
cat1
=
Cat()
let
master
=
Master()
//
master的delegate是弱引用,所以不能直接賦值
let
delegate
=
masterOrder
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 意識形態(tài)知識培訓課件
- 二零二五年度商業(yè)秘密保護協(xié)議5篇
- 二零二五年度城市綜合體開發(fā)商離婚協(xié)議與綜合體運營與維護合同3篇
- 二零二五年度建筑工程施工合同培訓教程匯編3篇
- 二零二五年度城市綠化工程承包勞務合同2篇
- 電動機基礎知識培訓課件
- 水稻除草劑知識培訓課件
- 面包師公共知識培訓課件
- Unit3 It's a pineapple.Lesson13(說課稿)-2024-2025學年人教精通版英語四年級上冊
- 福建省龍巖市新羅區(qū)2024-2025學年四年級上學期期末數(shù)學試題參考答案
- 2024年度吉林省國家電網(wǎng)招聘之法學類典型題匯編及答案
- 山東省臨沂市2023-2024學年高一上學期1月期末考試 物理 含答案
- 2024年世界職業(yè)院校技能大賽中職組“嬰幼兒保育組”賽項考試題庫-下(多選、判斷題)
- 2023年福建公務員錄用考試《行測》真題卷及答案解析
- 中華人民共和國學前教育法
- 辯論英文課件教學課件
- 銑工高級工測試題(含答案)
- 送貨員崗位勞動合同模板
- 2024年自然資源部所屬事業(yè)單位招聘(208人)歷年高頻難、易錯點500題模擬試題附帶答案詳解
- 《建筑施工安全檢查標準》JGJ59-2019
- 廣東茂名市選聘市屬國有企業(yè)招聘筆試題庫2024
評論
0/150
提交評論