首页 > 解决方案 > 为什么不通过将同名的预先存在的属性与所需的类型保持一致来暗示一致性?

问题描述

这是一个可以逐字复制的游乐场:

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,那么为什么会失败?

标签: swift

解决方案


添加了扩展以使 TV 的属性类型符合所需的类型

不是这样。协议说:

var brightness: LumensSpec & MutatingSpec { get }

班级说:

public let brightness: Mutating<Lumens>

这些类型不匹配。其他财产也是如此。


推荐阅读