第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在Swift中,如何聲明符合一個(gè)或多個(gè)協(xié)議的特定類型的變量?

在Swift中,如何聲明符合一個(gè)或多個(gè)協(xié)議的特定類型的變量?

12345678_0001 2019-10-09 14:54:51
在Swift中,我可以通過(guò)聲明如下來(lái)顯式設(shè)置變量的類型:var object: TYPE_NAME如果我們想更進(jìn)一步,并聲明一個(gè)符合多種協(xié)議的變量,可以使用protocol聲明式:var object: protocol<ProtocolOne,ProtocolTwo>//etc如果我想聲明一個(gè)符合一個(gè)或多個(gè)協(xié)議并且也是特定基類類型的對(duì)象,該怎么辦?相當(dāng)于Objective-C的樣子如下:NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;在Swift中,我希望它看起來(lái)像這樣:var object: TYPE_NAME,ProtocolOne//etc這使我們能夠靈活處理基本類型的實(shí)現(xiàn)以及協(xié)議中定義的添加接口。還有其他更明顯的方式可能會(huì)讓我丟失嗎?例例如,假設(shè)我有一家UITableViewCell工廠負(fù)責(zé)返回符合協(xié)議的單元。我們可以輕松地設(shè)置一個(gè)泛型函數(shù)來(lái)返回符合協(xié)議的單元格:class CellFactory {    class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {        //etc    }}稍后我想在利用類型和協(xié)議的同時(shí)使這些單元出隊(duì)var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell由于表視圖單元格不符合協(xié)議,因此返回錯(cuò)誤。我想能夠指定單元格是a UITableViewCell并符合MyProtocol變量聲明中的?理由如果您熟悉工廠模式,那么在能夠返回實(shí)現(xiàn)特定接口的特定類的對(duì)象的背景下,這將是有意義的。就像在我的示例中一樣,有時(shí)我們希望定義在應(yīng)用于特定對(duì)象時(shí)有意義的接口。我關(guān)于表格視圖單元格的示例就是這樣一種證明。盡管提供的類型與所提到的接口不完全一致,但是工廠返回的對(duì)象卻與之一致,因此我希望在與基類類型和聲明的協(xié)議接口交互時(shí)具有靈活性
查看完整描述

3 回答

?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊

在Swift 4中,現(xiàn)在可以聲明一個(gè)變量,該變量是類型的子類,并且可以同時(shí)實(shí)現(xiàn)一個(gè)或多個(gè)協(xié)議。


var myVariable: MyClass & MyProtocol & MySecondProtocol

或作為方法的參數(shù):


func shakeEm(controls: [UIControl & Shakeable]) {}

蘋果在WWDC 2017 大會(huì)402上宣布了這一點(diǎn):Swift的新增功能


第二,我想談?wù)劷M成類和協(xié)議。因此,在這里,我為UI元素引入了這種可晃動(dòng)的協(xié)議,該協(xié)議可以給人一點(diǎn)震動(dòng)效果,從而引起人們的注意。而且,我繼續(xù)并擴(kuò)展了一些UIKit類,以實(shí)際提供此震動(dòng)功能?,F(xiàn)在,我想寫(xiě)一些看起來(lái)很簡(jiǎn)單的東西。我只想編寫(xiě)一個(gè)函數(shù),該函數(shù)需要一堆可搖晃的控件,并搖晃那些能夠引起人們注意的控件。我可以在此數(shù)組中寫(xiě)什么類型?這實(shí)際上是令人沮喪和棘手的。因此,我可以嘗試使用UI控件。但并非所有UI控件在此游戲中都是可搖晃的。我可以嘗試使用shakable,但并非所有的shakable都是UI控件。實(shí)際上,在Swift 3中沒(méi)有很好的方式來(lái)表示這一點(diǎn)。Swift 4引入了用任何數(shù)量的協(xié)議組成一個(gè)類的概念。


查看完整回答
反對(duì) 回復(fù) 2019-10-09
?
喵喵時(shí)光機(jī)

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊

你不能像這樣聲明變量


var object:Base,protocol<ProtocolOne,ProtocolTwo> = ...

也不要像這樣聲明函數(shù)返回類型


func someFunc() -> Base,protocol<MyProtocol,Protocol2> { ... }

您可以像這樣聲明為函數(shù)參數(shù),但基本上是向上轉(zhuǎn)換。


func someFunc<T:Base where T:protocol<MyProtocol1,MyProtocol2>>(val:T) {

    // here, `val` is guaranteed to be `Base` and conforms `MyProtocol` and `MyProtocol2`

}


class SubClass:BaseClass, MyProtocol1, MyProtocol2 {

   //...

}


let val = SubClass()

someFunc(val)

到目前為止,您所能做的就像:


class CellFactory {

    class func createCellForItem(item: SpecialItem) -> UITableViewCell {

        return ... // any UITableViewCell subclass

    }

}


let cell = CellFactory.createCellForItem(special)

if let asProtocol = cell as? protocol<MyProtocol1,MyProtocol2> {

    asProtocol.protocolMethod()

    cell.cellMethod()

}

這樣,在技術(shù)上cell就等同于asProtocol。


但是,對(duì)于編譯器來(lái)說(shuō),cell只有接口UITableViewCell,而asProtocol只有協(xié)議接口。因此,當(dāng)您要調(diào)用UITableViewCell的方法時(shí),必須使用cell變量。當(dāng)您要調(diào)用協(xié)議方法時(shí),請(qǐng)使用asProtocol變量。


如果您確定單元格符合協(xié)議,則不必使用if let ... as? ... {}。喜歡:


let cell = CellFactory.createCellForItem(special)

let asProtocol = cell as protocol<MyProtocol1,MyProtocol2>


查看完整回答
反對(duì) 回復(fù) 2019-10-09
  • 3 回答
  • 0 關(guān)注
  • 1165 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)