当类型符合多个协议时,为什么不满足Swift协议的一致性

时间:2019-01-31 18:44:22

标签: swift swift-protocols

假设您具有以下协议和类:

protocol Foo { }

protocol Bar { }

protocol Deps {
  var bar: Bar { get }
}

class FooBar: Foo, Bar { }

然后,您定义一个具有符合FooBar协议的属性的新类。

class Scope: Deps {
  let bar: Foo & Bar = FooBar() // ❌ does not compile
}

尽管看似满足Deps协议要求,但它不能编译。编译器提供以下消息:

error: type 'Scope' does not conform to protocol 'Deps'
class Scope: Deps {
      ^

Protocols_Question.playground:6:7: note: candidate has non-matching type 'Bar & Foo'

但是,删除第二个协议一致性可以解决编译问题:

class Scope: Deps {
  let bar: Bar = FooBar() // ✅ compiles
}

这是怎么回事?直观地看,第一个示例应该满足Deps协议一致性。

Here's a Swift Playground演示了问题。

1 个答案:

答案 0 :(得分:0)

这是因为Deps协议要求变量bar符合协议Bar。您可以将FooBar()类(同时具有Foo和Bar协议)分配给变量bar,因为要求bar(至少)要符合Bar协议。但是,您不能尝试在定义变量后更改其应遵循的协议。

TL; DR-声明变量后不能更改其类型。