簡體   English   中英

如果帶有實現的擴展如下,我應該定義協議內部的計算屬性嗎?

[英]Should I define computed property of inside of protocol if the extension with implementation follows?

有什么區別:

protocol DashboardTargetInfo: TargetInfo {
    var apiVersion: Int { get }
}

extension DashboardTargetInfo {
    var apiVersion: Int {
        5
    }
}

協議定義中沒有包含計算屬性的那個

protocol DashboardTargetInfo: TargetInfo {}

extension DashboardTargetInfo {
    
    var apiVersion: Int {
        5
    }
}

如果擴展定義如下,我是否應該包括計算的“apiVersion”屬性的定義? 這兩個代碼片段之間有什么區別嗎?

在第一個版本中,apiVersion 是協議的一部分,任何符合標准的類型都必須實現該屬性或使用默認屬性。 在第二個中,這只是一個計算屬性,可用於符合它的類型,而不是協議的一部分。

一個例子:

struct Test1: DashboardTargetInfo { var apiVersion: Int }
struct Test2: DashboardTargetInfo { var apiVersion: Int { 10 } }

let values: [DashboardTargetInfo] = [Test1(apiVersion: 42), Test2()]
print(values.map(\.apiVersion))

使用協議的第一個版本,我們獲得了符合類型的值

[42, 10]

但是,如果我們的類型符合第二個示例,則apiVersion不是協議的一部分,因此僅使用默認計算值

[5, 5]

暫無
暫無

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

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