首先:错误代码:
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: 正确的代码和错误的代码之间有什么区别?
答案 0 :(得分:1)
协议不能继承自类。
但是,如果实现类符合某些条件,则可以为协议方法提供默认实现。 where
子句定义了这些条件。
此代码:
extension Action where Self: AA {
func method1() {
print("method1")
}
}
在班级method1()
中提供Action
协议AA
的默认实施。
以下内容毫无意义:
protocol Action where Self: AA {
func method1()
func method2()
}
您无法更改特定类的协议。