【移動應用開發(fā)技術】怎么在iOS中實現(xiàn)多繼承與多重代理_第1頁
【移動應用開發(fā)技術】怎么在iOS中實現(xiàn)多繼承與多重代理_第2頁
【移動應用開發(fā)技術】怎么在iOS中實現(xiàn)多繼承與多重代理_第3頁
【移動應用開發(fā)技術】怎么在iOS中實現(xiàn)多繼承與多重代理_第4頁
【移動應用開發(fā)技術】怎么在iOS中實現(xiàn)多繼承與多重代理_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論