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

SwiftUI中如何从WeatherKit的dayWeather中解包sunrise值?

解决从dayWeather解包sunrise的问题

你遇到的核心问题是:dayWeather是WeatherManager方法里的局部变量,最终被封装在LoadingState.loaded的关联值里,没法直接在任意extension里引用,所以Xcode提示“inaccessible”。另外你写的extension "Something"里的Something也没对应正确的类型,下面给你几个可行的解决办法:

方法一:给WeatherManager加计算属性

直接在WeatherManager类里加一个计算属性,从当前的loadingState里提取日出时间:

@MainActor
final class WeatherManager: ObservableObject {
    // 原有的所有代码保留不变
    
    // 新增计算属性
    var unwrappedSunrise: Date {
        guard case .loaded(_, let dayWeather) = loadingState else {
            return Date()
        }
        return dayWeather.first?.sun.sunrise ?? Date()
    }
}

之后你只需要通过weatherManager.unwrappedSunrise就能直接获取值了。

方法二:给LoadingState扩展

如果想把逻辑封装到状态枚举里,给LoadingState写个扩展:

extension WeatherManager.LoadingState {
    var unwrappedSunrise: Date {
        guard case .loaded(_, let dayWeather) = self else {
            return Date()
        }
        return dayWeather.first?.sun.sunrise ?? Date()
    }
}

使用时直接调用weatherManager.loadingState.unwrappedSunrise即可。

方法三:给Forecast扩展

如果Forecast是一个包含天气数组的泛型类型(从dayWeather.first能看出来它支持序列操作),可以直接扩展这个泛型类型:

extension Forecast where Element == DayWeather {
    var unwrappedSunrise: Date {
        self.first?.sun.sunrise ?? Date()
    }
}

这种情况下,当你从LoadingState.loaded里取出dayWeather实例后,直接调用dayWeather.unwrappedSunrise就能拿到值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:20:13