如何判断一个 Swift 类是继承自另一个类还是符合协议?

Posted

技术标签:

【中文标题】如何判断一个 Swift 类是继承自另一个类还是符合协议?【英文标题】:How can you tell if a Swift class is inheriting from another class or is conforming to a protocol? 【发布时间】:2014-07-04 13:55:01 【问题描述】:

例如,如果我们有一个类Foo,它继承自类Bar,并符合协议Baz

class Bar 

protocol Baz 

class Foo: Bar, Baz

如果我们事先不知道Bar 是一个类而Baz 是一个协议怎么办(例如,在阅读别人的代码时)。 在这种情况下,由于class Foo: 之后有多个声明,它可能很清楚。在 Swift 中,协议一致性声明必须在继承子句中的超类声明之后。另一方面,这也可能是一个没有继承的类,符合多种协议。

如果继承子句中只有一个声明呢?

class Foo: Bar 

或者:

class Foo: Baz 

在 Objective-C 中,协议名称用尖括号括起来是很清楚的。在 Swift 中,尖括号用于泛型。是否有语法支持使协议一致性在这种情况下更加直观?

【问题讨论】:

一旦Baz 开始警告您有未实现的必需方法,Bar 不会这样做,差异会不会变得明显?我的意思是,在类的使用上,几乎没有区别,对吧?您将尝试将其作为特定类型的对象,而该特定类型可能是协议。 例如,在Objective-C中,for (id<NSObject> obj in myArray)for(NSObject *obj in myArray)之间的区别是完全不存在的。这一行中的语法看起来不同,但循环中的用法是相同的。为什么它是协议还是类很重要? (也可以右键-godefintion) 命名约定怎么样?协议可以是BazProtocolBazDelegate——取决于协议的目的——如果你阅读headerextension 可以快速识别它类。 另外,补充一点,一个类可以符合多个协议,所以class Foo: Bar, Baz 不保证Bar是一个超类,只是保证Baz是一个超类协议。 你是对的。但这里的主要观点是,我认为 Bryan 并不是在谈论他编写的一个类,它是他编写的协议的子类/符合协议。他说的是查看其他人编写的项目(或至少项目的子集),并且他希望能够轻松识别这是子类还是仅符合协议。他没有办法回到过去并修复不表明前开发人员或他以前的自己留下的类/协议的糟糕命名约定。 【参考方案1】:

Swift 处理协议的方式与处理类型的方式大致相同。这是设计使然,其后果之一是在许多情况下难以立即区分协议一致性和类继承。

这是正面还是负面的事情是一个见仁见智的问题,有待讨论。因此,我不会解决它。

更多实用方面:

识别给定关键字是指Protocol 还是Class 的最快方法是option-click关键字。以下是在每种情况下这样做的结果:

当然,这只有在您阅读 Xcode 上的代码时才有意义。

【讨论】:

以上是关于如何判断一个 Swift 类是继承自另一个类还是符合协议?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何检查两个类是不是继承自另一个?

Kotlin 初学者继承(extend)

java面试测试题

初始继承和多态

如何在 swift 中声明一个“受保护”变量

如何制作一个继承自另一个 UITableViewCell 的 UITableViewCell?