0

我正在构建一个天气应用程序,该应用程序将提供对多个天气提供者的访问,从这些提供者中返回的数据集略有不同。我想让处理数据设置的系统尽可能通用,以加速新提供者的添加。

首先,我有一个枚举RValueUnits,其中包含可以返回值的所有可能单位:

enum RValueTypes { /// returned value
    case cm
    case celsius
    case decimal
    case mm
    case percentage
    case inch
    /// etc
}

例如,一些提供商可能会以 .mm 为单位返回降水量,而另一些则以 .cm 为单位。

我想要的是每个提供者都有一个自己的枚举,列出他们返回的所有属性,包括返回类型。例如:

enum DarkSkyProps: CaseIterable {
    static var allCases: [DarkSkyProps] {
        return [
            .apparentTemperature(unit: .celsius, setter: setApparentTemperature)
        ]}
    
    case apparentTemperature(unit: RValueType, setter: () throws -> Void)
}

与每个案例关联的 setter 函数处理属性的数据设置。例如,它将提供程序的返回值类型与用户的偏好进行比较,如果不同,它将在将其设置为关联属性的值之前对其进行更改,例如apparentTemperature在上述情况下。

static func setApparentTemperature() throws {
    /// processing logic goes here
}

我有一个问题和一个问题:

首先,我希望 DarkSkyProps 是 CaseIterable,所以设置是自动的。但是,我不知道如何调用迭代案例的关联 setter 函数:

for property in DarkSkyProps.allCases {
  /// want to call property.setter()
}

其次,理想情况下,我还希望有枚举 ForecastSource,例如:

enum ForecastSource {
    case DarkSky
    case Foreca
}

并且每个都与 Props 枚举相关联(即 ForecastSource.DarkSky 链接到 DarkSkyProps),例如:

case DarkSky(props: DarkSkyProps.AllCases)

因此,我只需要编写类似的内容,例如:

var source: ForecastSource = .DarkSky
for property in source.props {
    /// want to call property.setter()
}

有办法吗?

最后,考虑到我的目标,是否有更合适的完全不同的方法?

非常感谢!

4

0 回答 0