您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

带“ where Self”子句的Swift协议

带“ where Self”子句的Swift协议

SE-0156的过早结果就是能够将超类约束放在协议声明上(也就是说,能够定义类的类型protocol P where Self : C在哪里C),并且该语法在Swift 4.x中应该被拒绝,直到该功能被发布为止。已实施。尝试在Swift 4.x中使用此功能可能会导致错误编译和崩溃,因此在Swift 5之前我将避免使用它。

在Swift 5(Xcode10.2)中,该功能现已实现。从发行说明中

协议现在可以将其符合类型限制为子类化给定类。支持两种等效形式:

protocol MyView: UIView { /*...*/ }
protocol MyView where Self: UIView { /*...*/ }

Swift 4.2接受了第二种形式,但尚未完全实现,有时可能在编译时或运行时崩溃。(SR-5581)(38077232)

此语法MyView施加了一个超类约束,该约束将符合类型限制为从(或作为)继承的类型UIView。此外,的用法MyView语义上等同于类存在类(例如UIView& MyView),因为您可以访问该类的成员以及该值的协议要求。

例如,扩展发行说明的示例:

protocol MyView : UIView {
  var foo: Int { get }
}

class C : MyView {} // error: 'P' requires that 'C' inherit from 'UIView'

class CustomView : UIView, MyView {
  var foo: Int = 0
}

// ...

let myView: MyView = CustomView(frame: .zero)

// We can access both `UIView` members on a `MyView` value
print(myView.backgroundColor as Any)

// ... and `MyView` members as usual.
print(myView.foo)
Swift 2022/1/1 18:14:35 有692人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶