- 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/43646466/
如何在代码中展开/折叠WPF扩展器?我需要这样做才能在其中初始化控件。 最佳答案 使用IsExpanded属性,将其设置为true以使内容可见: myExpander.IsExpanded = tru
Powershell 展开让我发疯。 我有以下代码可以从交换收件人处检索电子邮件地址。我使用 ArrayList 是因为当您希望能够从数组中删除项目时,很多人都建议使用它。 $aliases = Ne
是否可以展开/折叠数据表中的子表?我的子表包含与其上方行相关的信息,我想显示/隐藏图像的点击。只是想知道我会怎么做? 这是我目前使用的:
我正在尝试创建一个可扩展的文本区域,仅当该框为空时,该区域才会折叠回其原始高度。如果它不为空,那么我希望文本区域保持扩展并根据需要增长(即,当用户输入更多文本时增长)。文本区域永远不应该隐藏输入的文本
当尝试将 nestedSortable jQuery 插件与其网站上提供的示例一起使用时,该插件无法正常工作。 拖放可以工作,但是当我需要折叠/展开时就会出现问题。我使用了另一个问题中建议的解决方案,
我有一个显示嵌套数据的表。数据如下所示: Objective 1 Objective 1.1 Objective 1.1.1 Objective 1.2
我正在使用 jQuery 从屏幕左侧展开/缩回菜单栏。 这是我到目前为止所拥有的: $(document).ready(function(){ $('.menu-button').on("clic
如何根据类别向页面上的图像添加隐藏/显示(折叠/展开)功能? 我希望具有特定类的图像在加载时折叠,并在 JS 中定义一些任意标记(比方说, Show ),然后在扩展中具有不同的任意标记( Hide )
我需要在折叠和展开后触发事件调整大小。当我尝试使用 SWT.Collapse 和 SWT.Expand 执行此操作时,树上没有任何更改,因为它在发生之前就已触发。有什么办法吗? 最佳答案 尝试调用 D
我有一个如下所示的域: package object tryme { type ALL = AlarmMessage :+: PassMessage :+: HeyMessage :+: CNil
我有一个扩展器列表,我想用全局切换按钮控制其展开状态(IsExpanded),该按钮应该在展开/折叠状态之间切换。 到目前为止,我得到的解决方案是通过将扩展器的 IsExpanded 状态绑定(bin
我试图根据 QWidget 是否展开/折叠来自动调整其大小。我尝试了几种发布的方法here和 here . 我没有设法采用这些,以便它按照我想要的方式工作:我希望 QWidget 在展开时调整自身大小
我正在尝试显示对象模型(机器人)列表,这些模型有一个可以是另一个机器人的字段 Parent。 我已经使用 Django 的 MPTT 实现了一个嵌套列表: {% load mptt_tags %}
鉴于下表/代码,我想添加两项。我不太了解 JavaScript,这段代码是另一个程序员留下的。该代码在所有其他方面都按预期工作。 这是两个项目: 表格应该以折叠状态开始。所有节点都应该是崩溃到“祖 p
我想要一张可以展开或折叠的表格。我的要求是当我点击表格行然后隐藏行显示或者当我点击其他表格行然后上一个打开的行隐藏或显示相对隐藏行。我发现一个 jquery jxpand 非常适合我,它显示隐藏的行但
如果当您向下滚动页面时元素展开或折叠,页面会突然重置并且焦点会移动到页面顶部。 有什么方法可以防止页面移动或使其不那么突然? $(document).ready(function () {
我正在使用以下代码来扩展特定的线性布局,并且遵循了本教程 http://gmariotti.blogspot.sg/2013/09/expand-and-collapse-animation.html
当垂直偏移超过特定阈值时,如何使android中的可折叠工具栏自动折叠/展开? 例如,如果垂直偏移超过 getScrollRange() 的半点,则可折叠工具栏应自动展开,低于该阈值时应折叠。 最佳答
http://t-webdesign.co.uk/new/ 如何在不使用固定高度属性的情况下让灰色 div (#content_right) 扩展到与左侧 div 相同的大小? 谢谢 最佳答案 你可能
设置一个简单的 WordPress 博客,仅包含一个页面,即博客存档。但我遇到了一个问题,我想要切换摘录和内容显示更多/显示更少的功能,以便访问者可以轻松浏览同一页面上的帖子,而无需页面重新加载或被发
我是一名优秀的程序员,十分优秀!