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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

即使協(xié)議要求給定類型,也必須強制轉(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é)議要求,我也必須強制將協(xié)議類型對象強制轉(zhuǎn)換為符合它的類型的繼承對象UIViewController?
查看完整描述

3 回答

?
慕容708150

TA貢獻1831條經(jīng)驗 獲得超4個贊

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


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


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


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


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


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


protocol Fooable: class where Self: UIViewController {

    func foo()

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

}

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


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


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

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

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


更新:


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


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

TA貢獻1865條經(jīng)驗 獲得超7個贊

常見的模式是這樣做的:


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中使用上述技巧。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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