假设您具有以下协议和类:
protocol Foo { }
protocol Bar { }
protocol Deps {
var bar: Bar { get }
}
class FooBar: Foo, Bar { }
然后,您定义一个具有符合Foo
和Bar
协议的属性的新类。
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
协议一致性。
答案 0 :(得分:0)
这是因为Deps协议要求变量bar符合协议Bar。您可以将FooBar()类(同时具有Foo和Bar协议)分配给变量bar,因为要求bar(至少)要符合Bar协议。但是,您不能尝试在定义变量后更改其应遵循的协议。
TL; DR-声明变量后不能更改其类型。