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

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

即使協(xié)議要求給定類型,也必須強(qiáng)制轉(zhuǎn)換

即使協(xié)議要求給定類型,也必須強(qiáng)制轉(zhuǎn)換

月關(guān)寶盒 2019-11-04 09:58:55
我有以下代碼:import UIKitprotocol Fooable: class where Self: UIViewController {    func foo()}class SampleViewController: UIViewController, Fooable {    func foo() {        print("foo")    }}let vc1: Fooable = SampleViewController()let vc2: Fooable = SampleViewController()// vc1.show(vc2, sender: nil) - error: Value of type 'Fooable' has no member 'show'// (vc1 as! UIViewController).show(vc2, sender: nil) - error: Cannot convert value of type 'Fooable' to expected argument type 'UIViewController'(vc1 as! UIViewController).show((vc2 as! UIViewController), sender: nil)注釋行無法編譯。為什么UIViewController即使Fooable協(xié)議要求,我也必須強(qiáng)制將協(xié)議類型對(duì)象強(qiáng)制轉(zhuǎn)換為符合它的類型的繼承對(duì)象UIViewController?
查看完整描述

3 回答

?
慕容708150

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

采用該協(xié)議Fooable告訴編譯器此特定UIViewController響應(yīng)foo(),至少如此。


在相反的結(jié)論,F(xiàn)ooable并沒有成為UIViewController必然。


如果受影響的類不是,約束Self: UIViewController只是編譯器在編譯時(shí)抱怨的另一信息。UIViewController


在您的情況下SampleViewController,F(xiàn)ooable對(duì)編譯器進(jìn)行批注僅知道SampleViewController對(duì)作出響應(yīng)foo()。它不知道類型實(shí)際上是的子類UIViewController。


因此,如果要訪問具體類的屬性,請(qǐng)不要在協(xié)議中為具體類注釋。


但是,您可以將show方法和其他常見屬性/方法添加到協(xié)議中


protocol Fooable: class where Self: UIViewController {

    func foo()

    func show(_ vc: Fooable, sender: Any?)

}

那么您可以使用,F(xiàn)ooable因?yàn)榫幾g器知道采用協(xié)議的類型會(huì)響應(yīng)該方法。


例如,當(dāng)您要?jiǎng)?chuàng)建異構(gòu)但受限制的集合類型時(shí),將類型注釋為協(xié)議的合適做法是


let array : [CustomStringConvertible] = ["Foo", 1, false]

array.forEach{ print("\($0)")}

該代碼使用description所有項(xiàng)目都響應(yīng)的屬性打印三個(gè)項(xiàng)目。編譯器可識(shí)別的三個(gè)項(xiàng)目如其中有一個(gè)類型的description財(cái)產(chǎn),還不如String,Int和Bool。


更新:


在Swift 5中,實(shí)現(xiàn)了對(duì)超類約束協(xié)議的支持。


查看完整回答
反對(duì) 回復(fù) 2019-11-04
?
莫回?zé)o

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

常見的模式是這樣做的:


protocol Fooable {

    func foo()

    var viewController: UIViewController

}


class SampleViewController: UIViewController, Fooable {


    func foo() {

        print("foo")

    }


    var viewController: UIViewController { return self }

}

在Swift 4中,您可以使類型為var UIViewController & Fooable。在Swift 3中使用上述技巧。


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

添加回答

舉報(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)