繁体   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