- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 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 ...
}
请注意一个特殊性,无论我们明确指定 b
为 Int?
类型(可选)还是类型 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/
我想知道是否可以在haskell中使用守卫内部的守卫。像这样: analyser modele instr | instr == NoCom = (modele, "No command" ,
我正在尝试在 Windows 7 上将 Guard 与适用于 Chrome 的 LiveReload 插件一起使用。它不起作用,我不知道如何解决这个问题。我使用 Bash 启动防护,然后在浏览器中激活
我有以下代码。我正在检查 3 个条件。您可以看到,对于第一个条件,我将 xml:get_tag_attr_s(...) 的输出存储在变量中,然后在 if block 中使用该变量。我的问题是,如果我尝
是否有类似于自动测试的 ctrl+c 强制运行所有规范的东西?我仍在努力微调我的 .Guardfile,但目前我可以在不重新启动 guard 的情况下强制运行所有规范吗? ctrl+c 退出守卫。 最
我刚刚在 Angular 大学完成了关于 Angular 2 和 Firebase 的 Angular 2 类(class)。 讲师 Vasco (@angular-university) 提出 Ro
我正在使用 guard-zeus我的应用程序中的 gem gem 的行为符合预期,但控制台的输出全部失真。 看起来像是添加了额外的制表符,所以这些行没有按应有的方式断开 有人知道如何解决这个问题吗?
有人可以解释 Xcode 中这些选项的作用吗? 启用涂鸦 启用防护边缘 启用Guard Malloc 它们是什么、它们做什么以及它们对调试/测试有多大用处? 谢谢。 最佳答案 来自documentat
我关注了 "How I Test" screencast at RailsCasts ,但是我遇到了 spork 的问题 $ guard Guard is now watching at '/User
以下代码被mix视为错误: case test do ... t when !is_list(t) -> false ... end 错误是“防护中的表达式无效,防
我知道可以像这样使用 guard 语句 guard let someConstant = someOptional() else { // ... } 我试着去做 struct MyStruc
我按照 Michael Hartl 的 Rails 教程使用 Spork 运行 Guard,我遇到了这个问题。以下是错误信息: 20:45:58 - INFO - Starting Spork for
尝试在我的 ubuntu 机器上安装 Guard,但是当我尝试从命令行运行它时出现此错误: No command 'guard' found, did you mean: Command 'guar
我是 Laravel 的新手。我正在浏览默认的身份验证中间件,我看到它正在使用: Auth::guard($guard)->guest() 检查用户是否是访客。 文档位于 https://larave
我正在通过 Ruby on Rails 教程(Michael Hartl)学习 RoR。 现在我尝试使用 Guard 运行测试。 我的 gem 文件: source 'https://rubygems
请帮我解决这个问题 我想使用多重身份验证。 我的 Laravel 版本是 5.2.* (5.2.29) 文档中写的我都做 //congig/auth.php [ 'guard' => 'we
Guard-RSpec 在自述文件中提到可以通过指定自定义 cmd 使用 spring 运行规范: guard :rspec, cmd: 'spring rspec' do # ... end 这
Guard-RSpec 在自述文件中提到可以通过指定自定义 cmd 使用 spring 运行规范: guard :rspec, cmd: 'spring rspec' do # ... end 这
一 点睛 当线程在访问某个对象时,发现条件不满足,就暂时挂起等待条件满足时再次访问,这就是 Guarded Suspension 设计模式。该设计模式的关注点在于临界值的条件是否满足,当达到设置的临界
我正在制作一个步骤向导,并试图阻止用户导航到即将到来的页面路由,除非他们导航到这些步骤,但允许他们导航到之前的页面/步骤。 我目前的解决方案是为每个页面/步骤指定一个步骤编号,但它不允许导航到前面的步
其他stackoverflow-ers, 我目前正在学习 Erlang。 有人可以指出我为什么会收到 illegal guard expression用这个守卫? add_new_prime(Idx,
我是一名优秀的程序员,十分优秀!