【问题标题】:Arrays & type-safety using optionals, best practices?使用选项的数组和类型安全,最佳实践?
【发布时间】:2020-02-26 04:41:21
【问题描述】:

我试图了解声明以下可选数组之间的区别。

问题 1) 在下面的示例中,假设数组附加了一个 nil 值,会发生什么以及哪些变量声明不会崩溃?

问题 2) 类似地假设我们将 String 类型替换为 someObject 类型。如果对象未能正确初始化并返回 nil,会发生什么情况以及哪些变量声明不会崩溃?

我相信 1,2) 的答案是 var 3 和 var 4。 我也认为 var one & var two 如果被初始化 () 可以工作,但我不确定。 我相当肯定 var 5 和 var 6 在尝试附加数组时会崩溃。

问题 3)假设我选择了选项 var one & var two & 他们被初始化为一个空数组,我可以添加 nil/empty objects/strings 吗?

问题 4)假设我选择了选项 var 3 和 var 4,是否建议使用 compactmap 过滤掉 nil 值?

问题 5)假设我选择了选项 var 5 和 var 6,是否建议使用 nil 合并或保护语句检查值以检查 nil/空对象/字符串?

var one : Array<String?> //array containing optional strings
//is the same type as
var two : [String?] //array containing optional strings

var three : Array<String?>? //optional array containing optional strings
//is the same type as
var four : [String?]? //optional array containing optional strings

var five : Array<String>? //optional array containing strings
//is the same type as 
var six : [String]? //optional array containing strings

我继承了一个代码库,我在其中接收 json 响应并使用 coddle 协议基于结构模型创建对象。我注意到变量被声明了。

var seven : [someModel]? 

型号是

struct someModel {

var a : String?

}

问题 6) 我是否正确假设因为结构的所有属性/属性都是可选的,所以即使 someModel.a = optional(nil),表示结构的对象也可以安全地附加到 var 7 中?

【问题讨论】:

  • Array&lt;T&gt;[T] 完全相同。这样就减少了一半的变体
  • 可选数组在语义上通常是空洞的,应该避免使用,除非你真的想区分空数组和 nil。

标签: swift


【解决方案1】:

首先,这些都不会崩溃。 nil 与 Java 的 NULL 不同(或 C 的 NULL,几乎与 ObjC 的 nil 不同)。访问nil 是完全安全的。它只是一个值,就像其他所有值一样。 nil 只是Optional.none 周围的一个语法糖。它们完全相同。可选项只是枚举:

enum Optional<Wrapped> {
    case some(Wrapped)
    case none
}

还有语法糖,所以你可以把Array&lt;T&gt;写成[T]。这些完全一样。

同样,您可以将Optional&lt;T&gt; 写为T?。这些又是完全相同的东西。

var one : Array<String?> //array containing optional strings
var two : [String?] //array containing optional strings

这些是Optional&lt;String&gt; 的数组。每个元素可以是.some(string),也可以是.none

var three : Array<String?>? //optional array containing optional strings
var four : [String?]? //optional array containing optional strings

正如你所说,这些是可选字符串的可选数组。他们可以是.none.some(array)。其中array 与上面的一和二相同。

var five : Array<String>? //optional array containing strings
var six : [String]? //optional array containing strings

正如你所说,这是一个可选的字符串数组。所以它可以是.none,也可以是.some(array),其中array是一个字符串数组(不是可选字符串)。

问题 6) 我是否正确假设因为结构的所有属性/属性都是可选的,所以即使 someModel.a = optional(nil) 也可以安全地将表示结构的对象附加到 var 7 中?

是的,虽然不是optional(nil);那将是String?? 而不是String?。只是nil

选项会因为 nil 而崩溃的唯一地方是,如果您在最后使用 ! 评估它们。这个崩溃的唯一原因是因为它的字面意思是“如果这是 nil,请让程序崩溃”,所以不要使用 !,除非你是这个意思。

这并不是一个真正的最佳实践问题,但既然你是这样命名的,有几点:

  • 类型名称应始终以大写字母开头。
  • 通常,我不鼓励可选集合。这包括Array?String?。您需要问:“无价值”与“空价值”有何不同。如果它们是相同的(并且它们通常是),那么您应该只使用空值。所以不要使用nil,而是使用""[]。然后所有的选项都消失了,代码变得更简单了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 2012-10-30
    • 2010-09-28
    • 1970-01-01
    • 2011-01-26
    • 2013-06-19
    • 2014-01-17
    • 2023-03-08
    相关资源
    最近更新 更多