swift - 为什么不通过将同名的预先存在的属性与所需的类型保持一致来暗示一致性?
问题描述
这是一个可以逐字复制的游乐场:
import UIKit
public final class TV {
public let brightness: Mutating<Lumens>
public let volume: Mutating<Decibels>
init() {
self.brightness=Mutating<Lumens>()
self.volume=Mutating<Decibels>()
}
}
public struct Lumens {}
public struct Decibels {}
public final class Mutating<T> {}
public protocol TVSpec {
var brightness: LumensSpec & MutatingSpec { get }
var volume: DecibelsSpec & MutatingSpec { get }
}
public protocol LumensSpec {}
public protocol DecibelsSpec {}
public protocol MutatingSpec {}
extension TV: TVSpec {} // Error: Type 'TV' does not conform to protocol 'TVSpec'
extension Mutating: LumensSpec where T == Lumens {}
extension Mutating: DecibelsSpec where T == Decibels {}
extension Mutating: MutatingSpec {}
一旦你这样做,我希望像我自己一样,你会看到错误。就是该类型TV
不符合协议TVSpec
。
我是否在这里遗漏了一些东西,因为TV's
属性与 in 的名称相同,TVSpec
并且添加了扩展以使TV's
属性的类型符合 in 所需的类型TVSpec
,那么为什么会失败?
解决方案
添加了扩展以使 TV 的属性类型符合所需的类型
不是这样。协议说:
var brightness: LumensSpec & MutatingSpec { get }
班级说:
public let brightness: Mutating<Lumens>
这些类型不匹配。其他财产也是如此。
推荐阅读
- reactjs - 永远在 CentOS 服务器上运行 React.JS 生产应用程序
- c++ - std::bind 到带有返回值的 std::function
- angular - 我在 Angular 7 中有一个错误(原理图工作流程失败)
- c - 为什么控件不进入repeat()函数?
- azure-data-factory-2 - Azure Batch 是否支持 Azure 数据工厂 v2 中的 .Net Core?
- javascript - 使用 3 个选择列表中的选项从 Google 站点中的 Google 表格返回表格
- gravity-forms-plugin - 重力形式数据到excel文件
- makefile - 部分扩展递归扩展变量
- php - 依赖注入传递参数给依赖
- ruby-on-rails - 从数组中返回不包含在记录字段结果中的字符串