我正在构建一个天气应用程序,该应用程序将提供对多个天气提供者的访问,从这些提供者中返回的数据集略有不同。我想让处理数据设置的系统尽可能通用,以加速新提供者的添加。
首先,我有一个枚举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()
}
有办法吗?
最后,考虑到我的目标,是否有更合适的完全不同的方法?
非常感谢!