Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么我们要在扩展中添加协议一致性?_Swift - Fatal编程技术网

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只是为了美观,我开始质疑我的决定。