Swift遵守带可选参数协议时能否省略类中未使用的isOnboarding参数?
解决方案
你可以通过给ErrorController协议添加分层默认实现,既满足协议的方法约束,又不需要在ContactsViewController中实现你用不到的带isOnboarding参数的方法,完全实现你的需求。
改造后可正常运行的完整代码
import UIKit class ErrorViewControllerDelegate {} protocol ErrorController { func showError(_ error: String, isOnboarding: Bool) } extension ErrorController { // 给协议要求的带isOnboarding参数的方法提供默认实现,自动调用单参数版本 func showError(_ error: String, isOnboarding: Bool) { showError(error) } // 提供单参数方法的通用默认实现,子类自定义实现后会优先走子类逻辑 func showError(_ error: String) {} } class ContactsViewController: UIViewController, ErrorController { // 仅需要实现这个单参数方法即完成协议遵守 func showError(_ error: String) { // 你的自定义错误提示逻辑 print("错误提示:\(error)") } } // 调用测试 let contacts: ErrorController = ContactsViewController() contacts.showError("I don't need a delegate.") contacts.showError("I need a delegate.", isOnboarding: true)
逻辑说明
- 协议原本要求的带
isOnboarding参数的showError方法已经有了扩展默认实现,遵守协议的类不需要额外实现该方法即可满足协议约束 - 当外部调用带
isOnboarding参数的方法时,会触发扩展的默认实现,自动调用你在ContactsViewController中自定义的单参数错误逻辑,完全不需要处理无关的isOnboarding参数 - 同时修复了原有代码中单参数
showError递归调用自身导致的死循环问题 - 如果后续有其他类遵守
ErrorController协议需要用到isOnboarding参数,只需要单独重写带参数的方法即可,不会影响现有逻辑
内容的提问来源于stack exchange,提问作者WishIHadThreeGuns
相关产品推荐
相关产品推荐

