- 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/56042683/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!