在Swift中,当协议被约束为从类继承时会发生什么?

时间:2018-06-15 01:58:13

标签: swift protocols swift-protocols

首先:错误代码:

class AA { }

protocol Action where Self: AA {
    func method1()
    func method2()
}

extension Action {
    func method1() {
        print("method1")
    }
}

class List: AA, Action {
    func method2() {
        print("List method2")
    }
}

class Detail: AA, Action {
    func method2() {
        print("Detail method2")
    }
}

let controllers = [List(), Detail()] as [Any]
if let action = controllers.first as? Action {
    action.method2() //error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x2).
}

然后正确的代码,一切正常:

protocol Action {
    func method1()
    func method2()
}

extension Action where Self: AA {
    func method1() {
        print("method1")
    }
}

问题1: 当协议被约束为从类继承时会发生什么?

问题2: 正确的代码和错误的代码之间有什么区别?

1 个答案:

答案 0 :(得分:1)

协议不能继承自类。

但是,如果实现类符合某些条件,则可以为协议方法提供默认实现。 where子句定义了这些条件。

此代码:

extension Action where Self: AA {
    func method1() {
        print("method1")
    }
}

在班级method1()中提供Action协议AA的默认实施。

以下内容毫无意义:

protocol Action where Self: AA {
   func method1()
   func method2()
}

您无法更改特定类的协议。