为什么我们要使用扩展添加协议一致性?

Bri*_*ure 1 swift

如果我有一个类Christmas和一个协议Merry,为了使Christmas符合Merry,许多人会这样做:

class Christmas {
    ...
}

extension Christmas: Merry {
    ...
} 
Run Code Online (Sandbox Code Playgroud)

它也受到Apple的鼓励.

但是,在定义类时,让类符合协议是不是更方便?像这样:

class Christmas: Merry {
    ...
}
Run Code Online (Sandbox Code Playgroud)

两种方法有什么区别?

Max*_*ner 7

它们是不同的编码风格.第一个选择

class Christmas {
   ...
}

extension Christmas: Merry {
    ...
}
Run Code Online (Sandbox Code Playgroud)

当你看全班时更清洁.您可以立即看到该类符合的所有协议实现.

使用第二个选项,您将协议的实现放在类中,并将其与类方法混合.但是,如果你使用

//MARK: - 
Run Code Online (Sandbox Code Playgroud)

与使用扩展时相比,代码变得不那么干净了.例如:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

在查看整个课程时,您会清楚地看到协议实现的分离: 在此输入图像描述

两个选项的功能是相同的.