- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的Swift程序因EXC_BAD_INSTRUCTION
和以下类似错误之一而崩溃。此错误是什么意思,我该如何解决?
致命错误:展开一个可选值时意外发现nil
要么
致命错误:意外发现nil,同时隐式展开Optional值
该帖子旨在收集“意外发现的零”问题的答案,以使它们不会分散且很难找到。随意添加您自己的答案或edit现有的Wiki答案。
最佳答案
答案是community wiki。如果您觉得可以做得更好,请随时edit it!
背景:什么是可选的?
在Swift中,Optional
是一个generic type,可以包含一个值(任何类型),或者根本不包含任何值。
在许多其他编程语言中,通常使用特定的“前哨”值来指示缺少值。例如,在Objective-C中,nil
(null pointer)表示缺少对象。但这在处理原始类型时变得更加棘手-是否应使用-1
来指示缺少整数,或者可能缺少INT_MIN
或某些其他整数?如果选择任何特定值表示“无整数”,则意味着它不再可以视为有效值。
Swift是一种类型安全的语言,这意味着该语言可帮助您弄清代码可以使用的值的类型。如果代码的一部分需要一个字符串,则类型安全性可防止您误将其传递给Int。
在Swift中,任何类型都可以设为可选。可选值可以采用原始类型的任何值,即or特殊值nil
。
可选内容在类型上带有?
后缀:
var anInt: Int = 42
var anOptionalInt: Int? = 42
var anotherOptionalInt: Int? // `nil` is the default when no value is provided
nil
表示可选项中缺少值:
anOptionalInt = nil
nil
与Objective-C中的
nil
不同。在Objective-C中,
nil
是缺少有效的对象指针;在Swift中,Optional不仅限于对象/引用类型。Optional的行为类似于Haskell的
Maybe。)
!
运算符(可选)完成的。例如:
let anOptionalString: String?
print(anOptionalString!) // <- CRASH
anOptionalString
是
nil
,因此在您强制展开包装的线上会发生崩溃。
!
而不是
?
定义。
var optionalDouble: Double! // this value is implicitly unwrapped wherever it's used
print(optionalDouble) // <- CRASH
nil
,因此在插座断开时崩溃被隐式展开。固定连接时,请尝试删除定义插座的代码行,然后重新连接它们。
!
运算符显式强制打开可选选项。在某些情况下,使用
!
是可以接受的–但是,只有在100%确定可选值包含一个值的情况下,才应使用它。
nil
进行比较。
if anOptionalInt != nil {
print("Contains a value!")
} else {
print("Doesn’t contain a value.")
}
if let x = anOptional {...}
或
if var x = anOptional {...}
,这取决于绑定后是否需要修改新变量的值。
if let number = anOptionalInt {
print("Contains a value! It is \(number)!")
} else {
print("Doesn’t contain a number")
}
number
)–然后,您可以自由使用它,就像它是非可选的一样。如果可选参数不包含值,则将按您期望的那样调用else子句。
var anOptionalInt : Int?
var anOptionalString : String?
if let number = anOptionalInt, let text = anOptionalString {
print("anOptionalInt contains a value: \(number). And so does anOptionalString, it’s: \(text)")
} else {
print("One or more of the optionals don’t contain a value")
}
if let number = anOptionalInt, number > 0 {
print("anOptionalInt contains a value: \(number), and it’s greater than zero!")
}
guard condition else {...}
定义。
guard let number = anOptionalInt else {
return
}
anOptionalInt
包含一个值,它将被解包并分配给新的
number
常量。保护后的代码将继续执行。如果它不包含值,则守卫将执行方括号内的代码,这将导致控制权的转移,因此紧随其后的代码将不会被执行。
guard let number = anOptionalInt else {
return
}
print("anOptionalInt contains a value, and it’s: \(number)!")
where
子句。
a ?? b
,其中
a
是可选类型,
b
与
a
是相同类型(尽管通常是非可选的)。
a
包含值,则将其取消包装。如果没有,则返回
b
”。例如,您可以这样使用它:
let number = anOptionalInt ?? 0
number
类型的
Int
常量,如果包含值,则该常量将包含
anOptionalInt
的值,否则将包含
0
。
let number = anOptionalInt != nil ? anOptionalInt! : 0
?
后即可。
foo
,类型为可选的
Foo
实例。
var foo : Foo?
foo
上调用不返回任何内容的方法,则只需执行以下操作:
foo?.doSomethingInteresting()
foo
包含一个值,则将在此方法上调用。如果没有,则不会发生任何不好的事情-代码将继续执行。
nil
发送消息)
foo?.bar = Bar()
foo
是
nil
,在这里也不会发生任何不良情况。您的代码将继续执行。
nil
进行比较来实现。
Void?
而不是
Void
)
if (foo?.bar = Bar()) != nil {
print("bar was set successfully")
} else {
print("bar wasn’t set successfully")
}
foo
是可选的,所以从它返回的任何内容也将是可选的。要解决此问题,您可以打开使用上述方法之一返回的可选选项,也可以打开
foo
自身,然后再访问返回值的方法或调用返回值的方法。
foo
具有可选属性
baz
,该属性具有属性
qux
–您可以编写以下内容:
let optionalQux = foo?.baz?.qux
foo
和
baz
是可选的,所以从
qux
返回的值将始终是可选的,而不管
qux
本身是否是可选的。
map
和
flatMap
map
和
flatMap
函数。这些允许您将非可选转换应用于可选变量。如果可选值具有值,则可以对其应用给定的转换。如果没有值,它将保留为
nil
。
let anOptionalString:String?
map
函数,我们可以使用
stringByAppendingString
函数将其连接到另一个字符串。
stringByAppendingString
采用非可选字符串参数,因此我们无法直接输入可选字符串。但是,通过使用
map
,如果
stringByAppendingString
具有值,我们可以使用允许使用
anOptionalString
。
var anOptionalString:String? = "bar"
anOptionalString = anOptionalString.map {unwrappedString in
return "foo".stringByAppendingString(unwrappedString)
}
print(anOptionalString) // Optional("foobar")
anOptionalString
没有值,则
map
将返回
nil
。例如:
var anOptionalString:String?
anOptionalString = anOptionalString.map {unwrappedString in
return "foo".stringByAppendingString(unwrappedString)
}
print(anOptionalString) // nil
flatMap
与
map
相似,不同之处在于它允许您从闭包主体中返回另一个可选内容。这意味着您可以将可选项输入到需要非可选输入的过程中,但可以输出可选项本身。
try!
do {
let result = try someThrowingFunc()
} catch {
print(error)
}
someThrowingFunc()
引发错误,该错误将被安全地捕获在
catch
块中。
error
块中看到的
catch
常量尚未由我们声明-由
catch
自动生成。
error
,它具有将其转换为有用格式的优点,例如:
do {
let result = try someThrowingFunc()
} catch let error as NSError {
print(error.debugDescription)
}
try
是尝试,捕获和处理来自抛出函数的错误的正确方法。
try?
可以吸收错误:
if let result = try? someThrowingFunc() {
// cool
} else {
// handle the failure, but there's no error information available
}
try!
进行“强制尝试”的方法:
let result = try! someThrowingFunc()
try!
-这非常罕见。
try?
系统。
关于swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46703597/
有谁知道蓝牙设备如何获取范围内可发现设备的设备 ID? 理想情况下,我正在寻找涉及蓝牙协议(protocol)最小实现的最简单解决方案。 一个起点会很好,我只是想创建一个设备,它可以以最小的功耗存储附
我有用于搜索Kibana中特定事件的查询,该查询与其他搜索一起保存,是否可以通过REST调用以编程方式更改它? 最佳答案 正如@Mohammad所说,所有与Kibana相关的元数据都存储在elasti
我正在使用带有这些注释的基本集成测试: @ExtendWith(SpringExtension::class) @SpringBootTest(classes = [SomeApplication::
以下是我的代码 HTML: Hello !! Javascript: $(function() { $('#content .child').click(function() {
我试图避免在每个 GDB session 中输入相同的命令。为此,我遵循了 rust discovery book 中的说明。但是当我通过 cargo run 运行程序时,程序没有像书中提到的那样工作
好的,我记得有一些命令可以放在 settings.py 文件中,这样基本上当您将 django 项目移动到另一个目录时,它就不会启动 foo-bar . 我知道我可以通过在它提到主目录的任何地方设置一
假设我正在制作一份注册表单。现在我希望它突出显示四个字段中的空白字段。现在我可以只执行一堆 if-else 语句,但这将花费很长时间。 假设我有以下代码: Javascript: if($firstn
我试图理解 C++ 中 regex 的逻辑 std::string s ("Ni Ni Ni NI"); std::regex e ("(Ni)"); std::smatch sm; std::re
运行时: vim /tmp/blah :q echo $? 我的退出状态为 1 .这破坏了包括 Git 在内的各种东西。如果我在没有 vimrc 的情况下运行 vim: vim -u NONE /tm
我无法通过“查找”来查找旧文件。我将我的发现链接到一个声明中,所有其他部分都运行良好。这是我所拥有的精简版。它搜索 $path 的目录树,并为找到的每个项目创建仅包含换行符的单独临时文件:所有文件、超
我已经多次看到这个问题,但没有一个答案对我有用。 我的 DotNet Core 应用程序失败 编码: public static void Main(string[] args) {
已解决见编辑 2 你好, 我一直在编写一个 Perl 程序来处理本地(专有)程序的自动升级(对于我工作的公司)。 基本上,它通过 cron 运行,不幸的是有内存泄漏(或类似的东西)。问题是泄漏只发生在
在 icCube 中创建到 Oracle 数据库的连接时,“选择现有数据库表”返回一个空的表列表。 连接很好,我可以查询模式创建 SQL 查询。 最佳答案 用户用作模式名称,但 Oracle 使用大写
我正在使用 VBA 循环遍历两个工作表上的行,如果它们匹配,则将工作表 2 中的行复制到工作表 1 中。 我的代码应该: 打开第二个工作簿 将所有信息复制到新工作表上的原始工作簿中 然后循环遍历原始工
当我尝试同步我的数据库时出现这个奇怪的错误: Unhandled rejection Error: Cyclic dependency found. roles is dependent of its
以编程方式发现 perl 模块具有的所有子例程的最佳方法是什么?这可以是一个模块、一个类(没有@EXPORT)或任何介于两者之间的东西。 编辑:下面的所有方法看起来都可以工作。我可能会在生产中使用 C
如何在“讨论”按钮左侧添加“共享”按钮。我希望该按钮与当前的“讨论”按钮具有相同的样式/颜色。 我从https://atmospherejs.com/joshowens/shareit添加了包 我将
我最近从 Netbeans 切换到 Eclipse,Eclipse 在我的项目中发现了许多 Netbeans 没有的语法错误,我不知道为什么。据可以看出,两个 IDE 都设置为使用 java 1.6。
我必须为我的项目设置一些不接受错误网址的规则。我为此使用正则表达式。 我的网址是“http://some/resource/location”。 此网址的开头、中间或结尾不应留有空格。 例如,这些空格
问题:鉴于作为 VMSS 的一部分启动的 N 个实例,我希望每个 Azure 实例上的应用程序代码能够发现其他对等实例的 IP 地址。我该怎么做? 总体目的是对实例进行集群,以提供主动被动 HA 或保
我是一名优秀的程序员,十分优秀!