当前位置: 首页 > 面试题库 >

带“ where Self”子句的Swift协议

慕胡媚
2023-03-14
问题内容

除了带有协议扩展的语法外:

protocol P {}
extension P where Self : UIView {}

…我偶然发现您可以在协议本身上使用相同的where子句:

protocol P where Self : UIView {}

请注意,这是 一样的where子句限制一个通用的协议,并 没有 自己做P上的通用协议。

我的实验似乎表明,此处只能使用冒号,并且冒号后面的内容必须是类或协议(可能是通用的)。

我很好奇:这是怎么逃避我的注意的?所以我去寻找它何时出现的证据。在Swift 3.0中,前一种语法是合法的,但后者 则不 合法。在Swift
3.3中,两者均合法。因此,后一种语法必须已在Swift 3.2之类的工具中悄悄引入。我之所以说“安静”是因为在发行说明中找不到任何有关它的信息。

第二种语法是什么?看来,这是否是确保没有其他类型可以采用此协议的便捷方法?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)


 类似资料:
  • 问题内容: 我将如何在没有硬编码值的情况下编写此sql语句? 宁愿有这样的事情: 提前致谢.. 问题答案: 用您当前的方式构造SQL查询是一个糟糕的主意,因为它为各种SQL注入攻击打开了大门 。为了正确执行此操作,您必须改为使用“ 预备语句”。这也将解决您目前显然遇到的各种逃避问题。 请注意,这是一个昂贵的调用(除非您的应用程序服务器使用语句缓存和其他类似的功能)。从理论上讲,最好先准备一次语句,

  • 问题内容: 是否可以在WHERE子句中使用LIMIT x? 如果是这样,怎么办? 我正在尝试这样做: 但我收到以下错误: 问题答案: 应该在之后。 句法 :

  • 协议(Protocols)为方法,属性和其他需求功能提供了蓝图。 它为方法或属性骨架而不是实现。 通过定义类,函数和枚举,可以进一步完成方法和属性的实现。 协议的一致性满足了协议要求的方法或属性。 语法 协议也遵循与类,结构和枚举类似的语法 - 协议在类,结构或枚举类型名称之后声明。 单个和多个协议声明也是可以的。 如果定义了多个协议,则必须用逗号分隔。 当要为超类定义协议时,协议名称应使用逗号跟

  • 协议规定了用来实现某一特定功能所必需的方法和属性。 任意能够满足协议要求的类型被称为遵循(conform)这个协议。 类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。 语法 协议的语法格式如下: protocol SomeProtocol { // 协议内容 } 要使类遵循某个协议,需要在类型名称后加上协议名称,中间以冒号:分隔,作为类型定义的一部分。遵循

  • 问题内容: 我有一个使用自定义方法连接到xib 的子类。 有没有办法可以在方法中初始化此单元格并仍然重用它?还是我必须使用重用标识符注册类本身? 问题答案: 惯用的NIB流程为: 使用重用标识符注册您的NIB。在Swift 3中 } 在Swift 2中: 定义您的自定义单元格类: class NameInput: UITableViewCell { } 在Interface Builder中创建一

  • 我找不到关于如何动态构造with子句的留档。jOOQ中常见的表表达式/CTE)。我的用例是这样的: 我需要嵌套动态创建的列,以便从这些动态创建的列中生成新数据 例如,我正在创建一个新字段,它是完全外部联接的非空结果。此字段仅在查询执行时可用,因此我需要将其存储在WITH子句中,以便在其他查询中引用它以进行其他计算 理想情况下,我可以动态地请求WITH子句类型的查询,通过将这个连接的数据集放在它自己