Swift 为什么我们要在扩展中添加协议一致性?
如果我有一个类Swift 为什么我们要在扩展中添加协议一致性?,swift,Swift,如果我有一个类Christmas,和一个协议Merry,使Christmas符合Merry,许多人会这样做: class Christmas { ... } extension Christmas: Merry { ... } 这也受到了我们的鼓励 然而,在定义类时,仅仅使其符合协议不是更方便吗?像这样: class Christmas: Merry { ... } 这两种方法有什么区别 符合协议的类与扩展之间存在差异 在编写类时,您知道这应该符合协议,然后您可以
Christmas
,和一个协议Merry
,使Christmas
符合Merry
,许多人会这样做:
class Christmas {
...
}
extension Christmas: Merry {
...
}
这也受到了我们的鼓励
然而,在定义类时,仅仅使其符合协议不是更方便吗?像这样:
class Christmas: Merry {
...
}
这两种方法有什么区别
符合
协议
的类与扩展
之间存在差异
在编写
类时,您知道这应该符合协议,然后您可以使用类符合协议。然而,扩展
意味着扩展现有类的功能。在编写类并使用它一年之后,您需要向类添加一些附加功能,这样您就可以简单地扩展类,而不是修改类。扩展不仅仅针对您的类,您还可以扩展每个可用类(本机框架、第三方库)的行为。符合协议的类与扩展之间存在差异
在编写类时,您知道这应该符合协议,然后您可以使用类符合协议。然而,扩展
意味着扩展现有类的功能。在编写类并使用它一年之后,您需要向类添加一些附加功能,这样您就可以简单地扩展类,而不是修改类。扩展不仅仅适用于您的类,您还可以扩展所有可用类(本机框架、第三方库)的行为。有一点不同。第一个符合您预期的协议。接下来是第二个,它也确认了协议,并且除了在扩展中编写方法之外
extension Christmas: Merry {
...
}
这样将使这些方法在类名为“Christmas”的整个项目中都可用。有一点不同。第一个符合您预期的协议。接下来是第二个,它也确认了协议,并且除了在扩展中编写方法之外
extension Christmas: Merry {
...
}
这样将使这些方法在整个项目中都可用,类名为“Christmas”它们是不同的编码样式。第一种选择
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
}
}
在查看整个类时,您可以清楚地看到协议实现的分离:
两个选项的功能相同。它们是不同的编码样式。第一种选择
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
}
}
在查看整个类时,您可以清楚地看到协议实现的分离:
两个选项的功能是相同的。没有大的区别,第一个是整洁的,因为您的根类不需要处理协议函数引起的所有ado。我使用它来保持代码整洁,将类核心函数放在原始文件中,而将所有委托方法放在另一个文件中。也可以扩展现有类。或可能重复。如果您使用这样的扩展,请注意:没有大的区别,第一个是整洁的,因为您的根类不需要处理协议函数引起的所有ado。我使用它来保持代码整洁,将类核心函数放在原始文件中,而将所有委托方法放在另一个文件中。也可以扩展现有类。或的可能副本。如果您使用这样的扩展,请注意:我不明白,您的意思是第一个方法没有“通过使用类名为“Christmas”的项目使这些方法可用”吗?是的。例如,为String类创建扩展将使这些方法可用于整个项目中的任何String类对象。我不明白,你的意思是第一个方法不会“使这些方法在整个项目中以类名“Christmas”可用吗?是的。例如,为String类创建扩展将使这些方法可用于整个项目中的任何String类对象。多年来,我一直在做扩展Foo:SomeProtocol
,但今天我发现,这两个选项的功能实际上并不相同。在第一个示例中,如果将Christmas
子类化,则将无法覆盖庆祝
函数。考虑到我只是出于美观目的而使用扩展
appraoch,我开始质疑我的决定。多年来我一直在做扩展Foo:SomeProtocol
,但今天我发现,这两个选项的功能实际上并不相同。在第一个示例中,如果将Christmas
子类化,则将无法覆盖庆祝
函数。考虑到我使用扩展
appraoch只是为了美观,我开始质疑我的决定。