gpt4 book ai didi

swift - 如何在赋值后使用 guard 语句检测 nil?

转载 作者:搜寻专家 更新时间:2023-11-01 05:48:49 24 4
gpt4 key购买 nike

我正在尝试使用 guard 语句来检查 nil。

我很困惑为什么下面的代码会漏掉它并生成 BAD_EXEC 错误:

    guard let event:Event! = eventsImagesLoading.removeValueForKey(location) else {
return
}
images[location] = responseData
event!.iconImgData = images[location]

我正在尝试检查方法调用后“事件”是否为零。如果是,它应该返回。但实际上它在 event!.iconImageData... 行上滑过并崩溃。

最佳答案

其他答案向您展示了如何解决您的问题,但并没有真正解释为什么会出现此错误,所以我想我会参与其中。


guard let ... else 语句,很像 if let ...,尝试绑定(bind)一个可选的解包值——通常只要这不是 nil---对于相同底层类型的非可选不可变;使用可选绑定(bind)

var a: Int? = 5
if let b = a {
// b unwrapped, type inferred to non-optional type Int
print(b) // "5"
}

如果 a 的值为 nil,则上述绑定(bind)将失败,因为 b 默认情况下(通过类型推断)是类型 Int 不能容纳 nil

在这种情况下,显式声明 b 是一个隐式展开的可选项是没有意义的,因为这将允许成功绑定(bind),即使 a 为 nil。一个等效的无意义 block 是显式声明 b 是可选的,此后可选 a 的“尝试可选绑定(bind)”(Int?) 到可选的 b (Int?) 自然总是会成功,并且 if let ... block 减少为完全冗余的 block -本地分配。

a = nil

if let b: Int! = a {
print(b) // "nil"
// wups, we managed to bind a to b even though a is nil ...

// note also this peculiarity
print(b.dynamicType) // Optional<Int>
let c: Int! = nil
print(c.dynamicType) // ImplicitlyUnwrappedOptional<Int>
}

if let b: Int? = a {
print(b) // nil
// wups, we managed to bind a to b even though a is nil ...
}

请注意一个特殊性,无论我们明确指定 bInt? 类型(可选)还是类型 Int!(隐式展开可选),绑定(bind)的不可变 b 传递到 if let block 中,对于这两种情况,只是一个常规可选(类型 Int? ).这解释了为什么您需要在 guard let 子句之后解包 event (event!.iconImgData) ,即使我们将其声明为隐式解包类型。

因此,在您的示例中,您的 guard let ... else 语句不会捕获 eventsImagesLoading.removeValueForKey(location)nil 的情况>,因为绑定(bind)到 event(它是隐式展开的可选类型 Event!)即使在 nil 情况下也会成功。

func foo() {
let bar : Int? = nil
guard let _: Int! = bar else {
print("this is surely nil")
return

}
print("but an implicitly unwrapped optional will fall through")
}
foo() // "but an implicitly unwrapped optional will fall through"

对于需要延迟初始化(值为 nil 直到初始化)的不可变对象(immutable对象),您通常应该只使用隐式解包选项。在隐式展开可选的初始化之后,它的值永远不应该是nil(而在上面的例子中,它的值是,在通过可选绑定(bind)初始化之后,就是;nil) .

此外,您通常应该让编译器推断您在 guard let INFER_THIS = ... else 中尝试绑定(bind)的不可变对象(immutable对象)的非可选类型> 或 if let INFER_THIS = ... 子句。


我们可以考虑是否应该甚至允许使用可选绑定(bind)可选类型(保证成功),但这是另一个讨论。

关于swift - 如何在赋值后使用 guard 语句检测 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36302890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com