我有这个简单的类和一个名为'ShowAlert'的假设协议,它是执行默认实现的扩展,默认的ViewController和它的ShowAlert协议实现。
protocol ShowAlert {
var titleForAlert: String! { get }
func messageForAlert() -> String!
func show()
}
extension ShowAlert where Self: UIViewController {
func show(){
let alert = UIAlertController(title: self.titleForAlert, message: self.messageForAlert(), preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Ok", style: .Cancel, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func showItNow(sender: AnyObject) {
self.show()
}
}
extension ViewController: ShowAlert {
var titleForAlert: String! {
get{
return "Foo"
}
}
func messageForAlert() -> String! {
return "Bar"
}
func show() {
// here I want to call the default implementation of the protocol to show the alert, then do something else
print("Good day sir!")
}
}
就像在子类中我可以调用'super.show()'然后继续实现我想要做的任何事情。
有什么办法吗?或者我的逻辑违背了设计的协议,并且不会发生这种情况?
答案 0 :(得分:3)
有一个简单的解决方案:只需在扩展程序中添加defaultShow
方法即可。
extension ShowAlert where Self: UIViewController {
func defaultShow(){
let alert = UIAlertController(title: self.titleForAlert, message: self.messageForAlert(), preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Ok", style: .Cancel, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
}
func show() {
defaultShow()
}
}
因此,在您的代码中,您只需拨打defaultShow
:
extension ViewController: ShowAlert {
// ...
func show() {
self.defaultShow()
print("Good day sir!")
}
}
还有另一种解决方案,您可以拨打.show()
而不是.defaultShow()
。然而,它使用铸造和破坏封装。如果你想看到它,请告诉我。