明确说明可选项的含义

在创建应用程序模型时,会遇到没有价值的属性。 使这些属性成为所有可选类型是很诱人的。 但是,如果以后再遇到它们,您是否仍然知道这些可选参数代表什么?

可选选项可以具有不同的含义。 可能是:

  • 没有价值
  • 该值尚未被检索

假设我们从User的下一个模型表示开始:

  struct用户{ 
let id:整数
命名:字符串
让电子邮件:字符串
var朋友:[用户]?
让地址:字符串?
让网站:URL?
}

如您所见,我们有一个带有数组类型的可选属性。 这是一个重复的空状态:我们可以使用空数组表示空状态,也可以使用nil值。 因此,在这种情况下,我们应该删除可选选项,并使用一个空数组表示空状态。

想象一下,我们有一个带有调用的API,该调用可一次检索用户的所有数据。 在此调用旁边,我们还可以调用以检索一些博客,这些博客也发送有关用户的一些信息。 但是在这种情况下,仅发送用户的id名称电子邮件 。 我们想要代表可以通过相同类型的第一个或第二个调用在应用程序中检索的用户。

我们可以做的该模型的第一个改进是表示根据我们进行的调用,某些属性可能同时丢失。 在用户的当前表示形式中,每个属性的可选变量中都隐藏有重复信息:是否检索信息。 干! 为了防止这种情况,我们可以为这些属性在User类型的范围内创建一个新的结构Details

  struct用户{ 
let id:整数
命名:字符串
让电子邮件:字符串
var详细信息:详细信息?
}
 扩展用户{ 
结构详细信息{
var朋友:[用户]
让地址:字符串
让网站:URL?
}
}

website属性仍然是可选的,但是在这里nil表示用户没有网站,也没有填写值。

让我们看看friends属性。 实际上,我们从API的JSON中获得了这个friends属性的URL,以检索该用户的朋友作为单独调用的响应。 因此,可以获取或不获取值,我们可以用枚举来表示。 我们也可以使其通用,以便与依赖于API的第二次调用的其他类型一起使用:

  struct FetchableValue  { 
让网址:URL
变量值:RemoteValue
 间接枚举RemoteValue  { 
案件未提取
提取大小写(值:T)
}
}

我们的最终模型将如下所示:

  struct用户{ 
let id:整数
命名:字符串
让电子邮件:字符串
var详细信息:详细信息?
}
 扩展用户{ 
结构详细信息{
var朋友:FetchableValue
让地址:字符串
让网站:URL?
}
}

现在,您可以清楚地看到数据的样子。 可选表示该数据不可用/没有任何值。 即将出现但尚未检索到的数据用FetchableValue类型表示。

Interesting Posts