You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:09:15