如果我有一个课程overflow: scroll
和一个协议Christmas
,为了使Merry
符合Christmas
,很多人会这样做:
Merry
Demo也鼓励它。
然而,在定义类时,让类符合协议是否更方便?像这样:
class Christmas {
...
}
extension Christmas: Merry {
...
}
两种方法的区别是什么?
答案 0 :(得分:7)
它们是不同的编码风格。第一个选项
class Christmas {
...
}
extension Christmas: Merry {
...
}
当你看全班时,更清洁。您可以立即看到该类符合的所有协议实现。
使用第二个选项,您将协议的实现放在类中,并将其与类方法混合。但是,如果您使用
//MARK: -
代码变得不那么干净,而不是使用扩展时。例如:
protocol Merry: class {
func celebrate()
}
class Cristmas: NSObject, Merry {
private var santa: AnyObject?
//MARK: - Private Methods
private func callSanta() {
//calling Santa
}
//MARK: - Merry Implementation
func celebrate() {
//celebration starts here
}
}
两个选项的功能相同。
答案 1 :(得分:1)
类符合protocol
和extension
之间存在差异。
在编写class
时,您知道这应该符合协议,然后您可以使用类符合协议。但是,extensions
意味着扩展现有classes
的功能。在编写课程并使用它一年后,您需要为您的课程添加一些额外的功能,因此您可以简单地扩展课程,而不是修改课程。扩展不仅适用于您的类,您可以扩展可用的每个类的行为(本机框架,第三方库)。
答案 2 :(得分:0)
有一点不同。第一个按照您的预期确认协议。来到第二个也确认协议,并且除了那些方法写作扩展
extension Christmas: Merry {
...
}
这样可以通过具有该类名称的项目使这些方法可用"圣诞节"