亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Swift協議擴展覆蓋

Swift協議擴展覆蓋

紅糖糍粑 2019-11-13 14:55:55
我正在嘗試使用Swift協議擴展,卻發現這種行為令人困惑。您能幫我得到我想要的結果嗎?請參閱代碼最后4行的注釋。(如果需要,可以將其復制粘貼到Xcode7游樂場)。謝謝??!//: Playground - noun: a place where people can playimport UIKitprotocol Color { }extension Color {  var color : String { return "Default color" } }protocol RedColor: Color { }extension RedColor { var color : String { return "Red color" } }protocol PrintColor {     func getColor() -> String}extension PrintColor where Self: Color {    func getColor() -> String {        return color    }}class A: Color, PrintColor { }class B: A, RedColor { }let colorA = A().color // is "Default color" - OKlet colorB = B().color // is "Red color" - OKlet a = A().getColor() // is "Default color" - OKlet b = B().getColor() // is "Default color" BUT I want it to be "Red color"
查看完整描述

3 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

簡短的答案是協議擴展不執行類多態性。這是有一定道理的,因為協議可以被結構體或枚舉所采用,并且因為我們不希望僅在沒有必要的地方采用協議來引入動態調度。


因此,在中getColor(),color實例變量(可能更準確地寫為self.color)并不意味著您認為它會做什么,因為您正在以類多態的方式思考,而協議不是。所以這工作:


let colorB = B().color // is "Red color" - OK

...因為您要讓一類學生解決問題color,但這并不能滿足您的期望:


let b = B().getColor() // is "Default color" BUT I want it to be "Red color"

...因為該getColor方法完全在協議擴展中定義。您可以通過getColor在B中重新定義來解決此問題:


class B: A, RedColor {

    func getColor() -> String {

        return self.color

    }

}

現在,該類的getColor被調用了,它對什么self是一個多態的想法。


查看完整回答
反對 回復 2019-11-13
?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

我設法得到它的工作通過定義color上Color和切換執行列表B.沒有太多的好,如果B必須是一個A雖然。


protocol Color {

    var color : String { get }

}


protocol RedColor: Color {


}


extension Color {

    var color : String {

        get {return "Default color"}

    }

}


extension RedColor {

    var color : String {

        get {return "Red color"}

    }

}


protocol PrintColor {

    func getColor() -> String

}


extension PrintColor where Self: Color {

    func getColor() -> String {

        return color

    }

}


class A : Color, PrintColor {


}


class B : RedColor, PrintColor {


}


let a = A().getColor() // "Default color"

let b = B().getColor() // "Red color"


查看完整回答
反對 回復 2019-11-13
  • 3 回答
  • 0 關注
  • 617 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號