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

Swift中访问枚举值返回nil的问题排查求助

问题:访问可选类实例属性返回nil而非预期的Yearly值

我定义了如下类和枚举:

class NewTabContainerModal {
    var newContainerDate = Date()
    var newContainerSelectedFilter : NewAllErrorFIlter = .Yearly

    func resetModal () {
        newContainerSelectedFilter = .Yearly
        newContainerDate = Date()
    }
}

enum NewAllErrorFIlter : String {
    case Monthly = "2"
    case Yearly = "1"
    case Daily = "3"
}

在ViewController中声明了可选类型变量:

var newContainerModal: NewTabContainerModal?

在viewWillAppear方法中尝试打印该变量的属性:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated) 

    let newContainerModelData = newContainerModal?.newContainerSelectedFilter
    print(newContainerModelData)
}

但打印结果返回nil而非预期的.Yearly值,请问问题出在哪里?


问题原因与解决方案

核心问题

你声明的newContainerModal是可选类型的类实例变量,但从未对它进行初始化——可选类型的默认值就是nil。当你通过可选链newContainerModal?.newContainerSelectedFilter访问属性时,因为可选值本身为nil,整个表达式的结果自然是nil,和类内部属性的默认值无关。

解决方案

需要在使用该变量前完成初始化,常见两种实现方式:

  1. 声明时直接初始化
    可以将变量改为非可选类型并直接初始化,或者保留可选类型但提前赋值:

    // 方式1:改为非可选类型,直接创建实例
    var newContainerModal = NewTabContainerModal()
    
    // 方式2:保留可选类型,提前初始化
    var newContainerModal: NewTabContainerModal? = NewTabContainerModal()
    
  2. 延迟初始化(在生命周期方法中创建)
    如果需要延迟实例化,可以在viewDidLoad等合适的时机创建实例:

    override func viewDidLoad() {
        super.viewDidLoad()
        newContainerModal = NewTabContainerModal()
    }
    

完成初始化后,再次访问newContainerModal?.newContainerSelectedFilter就能得到预期的.Yearly值。

内容的提问来源于stack exchange,提问作者Rohit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:00:11