- 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/57538663/
在检查对象是否为 nil 时,有人使用 1: if (object == nil) { //... } 有人用 2: if (nil == object) { //... } 1和2有
func InsertApData(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body)
为什么 nil.to_s 返回 "",而 nil.inspect 返回 "nil"(当显然 .inspect 使用 .to_s 方法) 最佳答案 "inspect" method of the Obj
运行时间 https://play.golang.org/p/sl12vfS9vP package main import "fmt" func main() { err := run()
我可以将三元条件运算符用于 if {} else {} 语句,如下所示:a ? x : y,还是问题?回答 1 : 回答 2。 是否可以使用这种格式来检查,而不是 a 是 true 还是 false,
无法弄清楚这里出了什么问题。按照设计设置说明,用谷歌搜索我能想到的一切,仍然没有运气。 undefined method `email' for # Extracted source (around
今天写一些 rspec 时,我遇到了一些意外的行为,将日期(和时间)实例与 nil 进行比较。这是一个使用原始 ruby 的示例(没有 Rails 或其他库): user@MacBook-Work
我将数据类型的非零值分配给非可选属性,然后将其分配给可选属性,最后用所述数据实例化图像。当可选项通过 if-let 子句时,它的 block 执行,抛出错误: Fatal error: Unexpec
swift 5.1 。 考虑以下。 let x: Any? = nil let y: Any = x print("x \(x)") // x nil pri
请耐心听我解释这一点, 我正在创建一个聊天室,用户可以在其中上传照片供其他人查看。当用户点击图标时,他们可以将照片上传到我的 Firebase 数据库(这已成功完成,我已经对此进行了测试)。照片的 U
我的 xCode 5.0 目前遇到一个奇怪的问题:一个对象在控制台中似乎为 nil,但同时它可以通过代码访问。 图 1:对象似乎为零 图2:NSLog(@"%@", imgDownloader) 的输
我有一个实现协议(protocol)的类,以便添加 3 个变量。我专门设置了图像变量,调试器显示该变量存在,但是在我打印它时在代码中显示为 nil,我的 if let 语句也认为该变量为 nil。 @
这个问题在这里已经有了答案: Swift 2 ( executeFetchRequest ) : error handling (5 个答案) 关闭 7 年前。 开始在 SWIFT 中学习编码,每次
两者 (not 'nil) 和 (not nil) 求值为T,那么'nil和nil有什么区别吗?那么 ''nil 呢?如果 ''nil 的计算结果为 'nil,那么 ''nil 是否也应该计算为 ni
(if '(nil nil) 'print-true 'print-false) (if '(nil) 'print-true 'print-false) 在上面的代码
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: obj.nil? vs. obj == nil 我发现了一个问题 - == nil 和 nil 哪个更好?
此代码段抛出异常: x = nil jsoned = x.to_json puts 'x.to_json=' + jsoned.inspect puts 'back=' + JSON.parse(js
基本上我有一个对象想要传递给前端。我在后端记录了它,它不是空的,但是在前端,当我提醒它时,它变成了空。 ... presentation := &presentationStruct { Obje
我创建了一个自定义错误类型来包装错误,以便在 Golang 中更轻松地进行调试。当有错误要打印时它可以工作,但现在它会引起 panic 。 Demo type Error struct { E
写一个符合我当前问题的标题有点难..我有一个 main() 函数,它使用另一个包 (database_sql) 中的函数。该函数初始化一个全局变量 sql.DB*。初始化后,变量不为nil,但是对于其
我是一名优秀的程序员,十分优秀!