什么是扩展使用符合协议

时间:2017-08-03 11:51:19

标签: ios swift

我想知道扩展类和简单类与符合协议之间的确切区别(可读性除外)

假设我创建了具有类似

的tableview方法的类
extension DemoVC:UITableViewDelegate,UITableViewDataSource
{
    //MARK: -
    //MARK: - UITableview delegate

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 0
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ....
 }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
     }
}

而不是如果我创建相同的类扩展以符合tableView方法,如

(except READABILITY)

那么哪个更好,为什么 extension Double { var mm: Double { return self / 1_000.0 } } let oneInch = 25.4.mm print("One inch is \(oneInch) meters")

第二个例子 随着双倍的延伸是好的

   let oneInch = 25.4. / 1000

{{1}}

所以这里我的问题哪个更好地使用双重OR的扩展我有简单的双倍乘以1000(如果我只需要特定的类)和为什么??

4 个答案:

答案 0 :(得分:1)

扩展类似于Objective-C中的类别。 (与Objective-C类别不同,Swift扩展没有名称。)

扩展可以扩展现有类型,使其采用一个或多个协议。要添加协议一致性,请按照为类或结构编写协议名称的方式编写协议名称

extension someClassName: OneProtocol, AnotherProtocol {
    // implementation of protocol requirements goes here
}

答案 1 :(得分:0)

其可读性和访问权限。如果您在同一个类中具有一致性并将其归档,则实现对类的其他变量和函数具有不同的访问级别,而如果在不同的文件中定义,则它将具有不同的访问级别。

答案 2 :(得分:0)

关于Swift 3,当您使用扩展时,您无法访问扩展类中的私有方法和结构。因此,如果您的数据模型是私有的,则无法通过扩展程序访问它,如果您正在实施表格查看方法,则很可能会这样做。

关于Swift 4,唯一一次绝对必要的扩展是当你无法访问你正在扩展的类的源时。在Swift 4中,私有数据可以通过同一文件中定义的扩展来访问,在这种情况下,任何一种方式都可以工作。

遵循一个好的经验法则:如果您有权访问类源并允许修改它,那么只需直接在类中遵循协议即可。如果您没有源,或者您不允许修改源,那么您将需要使用扩展名。

除此之外,唯一的主要区别在于可读性,正如您已经提到的那样,所以它归结为风格问题,等待您的设计不需要访问私人数据。

答案 3 :(得分:0)

extension下面,我们使用的是继承概念。

extension DemoVC:UITableViewDelegate,UITableViewDataSource
{
    //MARK: -
    //MARK: - UITableview delegate

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return 0
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ....
 }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
    }
}

以下extension是一个类中添加的更多功能。

extension Double {
        var mm: Double { return self / 1_000.0 }
     }
    let oneInch = 25.4.mm
    print("One inch is \(oneInch) meters")

同样extension Double {}我们可以在项目中的任何类中使用。意味着我们必须调用类似let oneInch = 25.4.mm的方法。