2017-04-01 72 views
0

我已经给出了协议扩展中的一些默认实现代码。但是如何在类中调用这个指定的代码来确认协议。下面是一个例子:如何在swift中调用protocol中的默认实现代码?

class BaseClass {} 
protocol ImplementedProtocol { 
    func printInfo() 
} 
extension ImplementedProtocol where Self: BaseClass { 
    func printInfo() { 
     print("Hello! This is ImplementedProtocol") 
    } 
} 

class SuperClass: BaseClass, ImplementedProtocol { 
    func printInfo() { 
     // I should do sth here. 
     print("Hello! This is SuperClass") 
    } 
} 
class SubClass: SuperClass { 
    override func printInfo() { 
     super.printInfo() 
     print("This is SubClass") 
    } 

} 

let a = SubClass() 
a.printInfo() // I get "Here is SuperClass. Here is SubClass." 
// But I want "Here is ImplementedProtocol. Here is SuperClass. Here is SubClass." 
+1

我相信[这个问题](HTTP://计算器.com/questions/32602712/calling-protocol-default-implementation-from-regular-method)可能对你有所帮助。 –

+1

好吧,当我尝试在SuperClass中使用'(self as ImplementedProtocol).printInfo()'这样的代码时,它只是在SubClass中调用'printInfo()'。它会导致无限循环。 –

回答

0

协议更像编译时保证类型具有某些方法和属性。默认实现通过向协议的采用者注入实现来增加另一层复杂性。我没有通过Swift的源代码的技能,但我认为当采用者提供它自己的实现时,默认的实现被掩盖了,没有办法让它恢复。

一种解决方法是使用不同的名称添加一个方法来你的协议,它提供的默认实现,并且可以通过任何收养被称为:

protocol ImplementedProtocol { 
    func printInfo() 

    func defaultPrintInfo() 
} 

extension ImplementedProtocol where Self: BaseClass { 
    func printInfo() { 
     defaultPrintInfo() 
    } 

    func defaultPrintInfo() { 
     print("Hello! This is ImplementedProtocol") 
    } 
} 

class SuperClass: BaseClass, ImplementedProtocol { 
    func printInfo() { 
     self.defaultPrintInfo() 
     print("Hello! This is SuperClass") 
    } 
} 
+0

因为我的想法不是Swift中的首选代码风格,所以我决定将实现从'ImplementedProtocol'移动到'SuperClass',但我必须为从'ImplementedProtocol'继承的类实现类似的代码。感谢您的回答。 –

相关问题