我试图了解声明以下可选数组之间的区别。
问题 1) 在下面的示例中,假设数组附加了一个 nil 值,会发生什么以及哪些变量声明不会崩溃?
问题 2) 类似地想象我们用 someObject 类型交换了类型 String。如果对象未能正确初始化并返回 nil,会发生什么以及哪些变量声明不会崩溃?
我相信 1,2) 的答案都是 var 3 和 var 4。我也认为 var one & var two 如果它们被初始化 () 可以工作,但我不确定。我相当肯定 var 5 和 var 6 在尝试追加数组时会崩溃。
问题 3) 假设我使用选项 var one & var two & 它们被初始化为空数组,我可以添加 nil/空对象/字符串吗?
问题 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
Run Code Online (Sandbox Code Playgroud)
我继承了一个代码库,我在其中接收 json 响应并使用 coddle 协议创建基于结构模型的对象。我注意到变量被声明了。
var seven : [someModel]?
Run Code Online (Sandbox Code Playgroud)
该模型是
struct someModel {
var a : String?
}
Run Code Online (Sandbox Code Playgroud)
问题 6)我是否正确地假设,因为结构的所有属性/属性都是可选的,即使 someModel.a = optional(nil),表示结构的对象也可以安全地附加到 var 7?
首先,这些都不会崩溃。nil
不像 Java 的 NULL(或 C 的 NULL,几乎没有像 ObjC 的 nil)。访问nil
是完全安全的。它只是一个值,就像其他所有值一样。nil
只是周围的一块语法糖Optional.none
。它们完全一样。Optionals 只是枚举:
enum Optional<Wrapped> {
case some(Wrapped)
case none
}
Run Code Online (Sandbox Code Playgroud)
还有语法糖,所以你可以写Array<T>
为[T]
. 这些是完全一样的。
同样,您可以编写Optional<T>
为T?
. 这些又是一回事。
var one : Array<String?> //array containing optional strings
var two : [String?] //array containing optional strings
Run Code Online (Sandbox Code Playgroud)
这些是Optional<String>
. 每个元素可以是.some(string)
也可以是.none
。
var three : Array<String?>? //optional array containing optional strings
var four : [String?]? //optional array containing optional strings
Run Code Online (Sandbox Code Playgroud)
正如你所说,这些是可选字符串的可选数组。它们可以是.none
或.some(array)
。这array
与上面的一和二相同。
var five : Array<String>? //optional array containing strings
var six : [String]? //optional array containing strings
Run Code Online (Sandbox Code Playgroud)
正如你所说,这是一个可选的字符串数组。因此它可以是.none
或者也可以是.some(array)
其中array
是字符串(不可选字符串)的阵列。
问题 6)我是否正确地假设,因为结构的所有属性/属性都是可选的,即使 someModel.a = optional(nil),表示结构的对象也可以安全地附加到 var 7?
是的,虽然不是optional(nil)
;那将是一个String??
而不是一个String?
。这只是nil
。
唯一会因为 nil 而崩溃的地方是如果你!
在最后用 a 来评估它们。这个崩溃的唯一原因是因为它的字面意思是“如果它是零,请崩溃程序”,所以!
除非你是这个意思,否则不要使用。
这不是一个真正的最佳实践问题,但既然你是这样命名的,那么几点:
Array?
和String?
。您需要问:“无值”与“空值”有何不同。如果它们相同(并且通常是),那么您应该只使用空值。所以,而不是nil
,只需使用""
和[]
。然后所有的选项都消失了,代码变得更简单了。 归档时间: |
|
查看次数: |
167 次 |
最近记录: |