簡體   English   中英

具有計算屬性的協議

[英]Protocol with computed properties

swift 是否有特定原因限制我們在protocol聲明中提供計算屬性? 因為我們只有機會將這些計算屬性設置為protocol extension

單詞 -> 代碼:

為什么這不起作用-(背后的邏輯是什么)

protocol GridableGraph {

    var yTick: Float { get }
    var yTicksCount: Int { get }

    var xTick: Float{ get }
    var xTicksCount: Int { get }

    var maxYValue: Float { return Float(yTicksCount - 1) * yTick }
    var maxXValue: Float { return Float(xTicksCount - 1) * xTick }
}

雖然這樣做

protocol GridableGraph {

    var yTick: Float { get }
    var yTicksCount: Int { get }

    var xTick: Float{ get }
    var xTicksCount: Int { get }
}

extension GridableGraph{
    var maxYValue: Float { return Float(yTicksCount - 1) * yTick }
    var maxXValue: Float { return Float(xTicksCount - 1) * xTick }
}

請不要通過向我提供一些我已經涵蓋的文檔引用來重寫我剛剛說過的內容:)

協議旨在提供接口(一組方法和屬性),但將實現留給實現類。

當你有一個協議的擴展時,決定讓這些需要一個實現,而不是弄亂庫或框架內的代碼。

假設您想使用您喜歡的方法擴展UITableViewDataSource協議。 如果 Swift 不需要實現,那么UIKit中所有使用此協議的UIViewControllers會發生什么情況? 從技術上講,您可以調用該方法,但由於該方法不存在,您會收到錯誤消息。

Swift 通過在擴展協議時要求實現來解決這個問題。 這樣,您既可以不實現它(使用默認實現),也可以實現它(使用類中的實現)。 這是因為 Apple 希望 Swift 盡可能安全。

編輯:您沒有問為什么擴展需要默認實現,而是問為什么不能將默認實現放在您的protocol ,而是需要將其放在extension 我想這是因為 Swift 喜歡保持一致,並且因為他們已經允許在協議擴展中使用默認實現,所以他們也可能要求默認實現在那里。

請記住,在同一個文件中使用多個擴展名並沒有錯,甚至在Ray Wenderlich Swift 樣式指南中建議將其作為拆分代碼以獲得更好概述的首選方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM