从Model返回变量到其他viewcontroller



我正在制作一个天气应用程序。我基本上创建了一个类,我将只从API获取数据,并根据需要返回它们。我有像cityNamecurrentWeather这样的变量。问题是,有时API不提供他们所有,所以我需要检查如果他们是nil或不返回他们之前。我想到的是先这样设置变量:

private var cityNamePrivate: String! 

var cityNamePublic: String {
if cityNamePrivate == nil {
// 
}
else { return cityNamePrivate }

但是你可以想象,这很糟糕,因为我有很多变量。还有更好的逻辑吗?我应该把它们退回去,然后在寄到哪里的时候再检查吗?

这里的问题是您将有许多变量需要处理。它不只是从API返回它们,它还在你的应用程序中处理它们,也许在一些处理代码中。

一个解决方案是使用一个具有许多属性的大类或结构。这将工作得很好,很容易实现,但将需要大量的重复代码。此外,每当远程web服务提供了一些新的属性时,它将需要更改您的API和所有代码。

另一种方法是用一个动态容器代替大的不灵活的类或结构,例如,一个项的数组[ Item ]或一个将名称与项[ String : Item ]相关联的字典。如果数据只是字符串,就很简单了。如果它有几个类型,您可能不得不为元素实现一个小的类型系统。例子:

var x : [ String: String] = [:]
x["city"]="Strasbourg"
x["temperature"]="34°C"
struct Item {
var name : String
var value : String
}
var y : [ Item ] = [Item(name:"city",value:"Strasbourg"),
Item(name:"temperature", value:"34°C")]

这种方法的另一个优点是,您可以保持对语义的忠诚:在API中不可用的信息(例如"未知")与默认值不同。例如,如果天气API没有返回温度,你将不会在应用程序中显示0。因为0与"未知"不一样。虽然字符串在这方面更健壮,但是缺少名称与空名称是不一样的。

最后这句话表明,在你目前的方案中,有一个大数据传输对象,你应该考虑保留属性作为可选的,并将处理未知数据的责任转移到你的应用程序。

最新更新