swift - 如果 Swift 协议(protocol)是用类型约束定义的,为什么不能直接访问该类型的属性/方法?

标签 swift types protocols type-constraints

<分区>

如果我定义一个带有类型约束的协议(protocol):

Protocol Fooable where Self: UIView {}

为什么 UIView 的属性和方法不能在任何符合 Fooable 的东西上直接访问?

例如:

func test(foo: Fooable) {
    foo.frame = .zero // doesn't compile because `frame` isn't part of `Fooable`
}

由于协议(protocol)签名中的类型限制,编译器难道不应该知道 Fooable 现在实际上是 Fooable & UIView 吗?

这显然可以通过以下方式实现:

typealias Foo = UIView & Fooable//现在使用 Foo 作为函数参数的类型

但我更好奇为什么会这样。

最佳答案

  • 约束

    where Self: UIView {}
    

    是给编译器的信息,只有 UIView 及其子类被允许采用该协议(protocol)。如果要打破规则,编译器会在编译时抛出错误。

  • 用作类型的协议(protocol)仅响应其主体中声明的属性和函数。

关于swift - 如果 Swift 协议(protocol)是用类型约束定义的,为什么不能直接访问该类型的属性/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54065593/

相关文章:

ios - 如何在 Swift 中获取唯一的设备 ID?

Haskell,在函数内将 Int 和 Float 相乘

将 float 转换为 int 指针并返回 float?

c - C 语言的以太网原始数据和帧校验序列

objective-c - 需要执行一组方法中的至少一个的 Objective C 协议(protocol)

protocols - 为什么SPI通信提供不同的模式?

ios - 如何让 NSTimer 显示 Hrs : Min : Sec

objective-c - YTPlayerView 未找到问题

ios - 保留在一个圆圈中设置的3个变量之间的循环?

c++ - 如何识别 LLVM/C++ 中的任何类型的指令?