- 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/57794330/
我的问题:非常具体。我正在尝试想出解析以下文本的最简单方法: ^^domain=domain_value^^version=version_value^^account_type=account_ty
好吧,这就是我的困境: 我正在为 Reddit 子版 block 开发常见问题解答机器人。我在 bool 逻辑方面遇到了麻烦,需要一双更有经验的眼睛(这是我在 Python 中的第一次冒险)。现在,该
它首先遍历所有 y 值,然后遍历所有 x 值。我需要 X 和 y 同时改变。 For x = 3 To lr + 1 For y = 2 To lr anyl.Cells(x, 1)
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
如何转换 Z-score来自 Z-distribution (standard normal distribution, Gaussian distribution)到 p-value ?我还没有找到
我正在重写一些 Javascript 代码以在 Excel VBA 中工作。由于在这个网站上搜索,我已经设法翻译了几乎所有的 Javascript 代码!但是,有些代码我无法准确理解它在做什么。这是一
我遇到过包含日期格式的时间戳日期的情况。然后我想构建一个图表,显示“点击”项目的数量“每天”, //array declaration $array1 = array("Date" => 0); $a
我是scala的新手! 我的问题是,是否有包含成员的案例类 myItem:Option[String] 当我构造类时,我需要将字符串内容包装在: Option("some string") 要么 So
我正在用 PHP 创建一个登录系统。我需要用户使用他或她的用户名或电子邮件或电话号码登录然后使用密码。因为我知道在 Java 中我们会像 email==user^ username == user 这
我在 C++ 项目上使用 sqlite,但是当我在具有文本值的列上使用 WHERE 时出现问题 我创建了一个 sqlite 数据库: CREATE TABLE User( id INTEGER
当构造函数是显式时,它不用于隐式转换。在给定的代码片段中,构造函数被标记为 explicit。那为什么在 foo obj1(10.25); 情况下它可以工作,而在 foo obj2=10.25; 情况
我知道这是一个主观问题,所以如果需要关闭它,我深表歉意,但我觉得它经常出现,让我想知道是否普遍偏爱一种形式而不是另一种形式。 显然,最好的答案是“重构代码,这样你就不需要测试是否存在错误”,但有时没有
这两个 jQuery 选择器有什么区别? 以下是来自 w3schools.com 的定义: [attribute~=value] 选择器选择带有特定属性,其值包含特定字符串。 [attribute*=
为什么我们需要CSS [attribute|=value] Selector根本当 CSS3 [attribute*=value] Selector基本上完成相同的事情,浏览器兼容性几乎相似?是否存在
我正在解决 regx 问题。我已经有一个像这样的 regx [0-9]*([.][0-9]{2})。这是 amont 格式验证。现在,通过此验证,我想包括不应提供 0 金额。比如 10 是有效的,但
我正在研究计算机科学 A 考试的样题,但无法弄清楚为什么以下问题的正确答案是正确的。 考虑以下方法。 public static void mystery(List nums) { for (
好的,我正在编写一个 Perl 程序,它有一个我收集的值的哈希值(完全在一个完全独立的程序中)并提供给这个 Perl 脚本。这个散列是 (string,string) 的散列。 我想通过 3 种方式对
我有一个表数据如下,来自不同的表。仅当第三列具有值“债务”并且第一列(日期)具有最大值时,我才想从第四列中获取最大值。最终值基于 MAX(DATE) 而不是 MAX(PRICE)。所以用简单的语言来说
我有一个奇怪的情况,只有错误状态保存到数据库中。当“状态”应该为 true 时,我的查询仍然执行 false。 我有具有此功能的 Controller public function change_a
我有一个交易表(针对所需列进行了简化): id client_id value 1 1 200 2 2 150 3 1
我是一名优秀的程序员,十分优秀!