iOS Swift:通过协议在类间访问属性与方法的问题排查
问题排查与修复
你的代码运行时会触发致命错误,核心原因是FilterSessionVC中的presenter属性为隐式解包可选类型(!),但你未在调用viewDidLoad前对其完成初始化,导致访问presenter.numberOfSection时尝试解包nil值。
修复方案
1. 初始化Presenter实例
在FilterSessionVC的初始化阶段(或viewDidLoad执行前的生命周期方法中),为presenter赋值具体的协议实现类实例:
import UIKit class FilterSessionVC: UIViewController { var presenter : FilterSessionPresenter! // 代码初始化场景 override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) presenter = FilterSessionPresenterImplementation() } // Storyboard/XIB初始化场景 required init?(coder: NSCoder) { super.init(coder: coder) presenter = FilterSessionPresenterImplementation() } override func viewDidLoad() { super.viewDidLoad() print(presenter.numberOfSection) // 此时会正常输出200 presenter.viewLoaded() // 可正常调用协议定义的方法 } }
2. 可选优化:改用普通可选类型
若不想依赖隐式解包的强制行为,可将presenter声明为普通可选类型,使用时通过可选绑定安全访问:
class FilterSessionVC: UIViewController { var presenter: FilterSessionPresenter? override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) presenter = FilterSessionPresenterImplementation() } required init?(coder: NSCoder) { super.init(coder: coder) presenter = FilterSessionPresenterImplementation() } override func viewDidLoad() { super.viewDidLoad() if let presenter = presenter { print(presenter.numberOfSection) presenter.viewLoaded() } } }
核心要点
- 隐式解包可选类型(
!)要求变量必须在使用前完成赋值,否则会触发运行时崩溃。 - 协议仅定义接口规范,必须通过具体的实现类(如
FilterSessionPresenterImplementation)创建实例,才能调用其属性与方法。
内容的提问来源于stack exchange,提问作者Sheraz Hussain
相关产品推荐
相关产品推荐

