问题标签 [forced-unwrapping]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
23 回答
153775 浏览

swift - Swift 语言中的感叹号是什么意思?

Swift 编程语言指南有以下示例:

然后在将公寓分配给该人时,他们使用感叹号来“打开实例”:

“打开实例”是什么意思?为什么有必要?它与仅执行以下操作有何不同:

我对 Swift 语言非常陌生。只是想把基础知识弄下来。


更新:
我错过的最大难题(未在答案中直接说明 - 至少在撰写本文时没有)是当您执行以下操作时:

正如我最初认为的那样,这并不意味着“john是类型Person并且可能为零”。我只是误解了这一点,Person并且Person?是完全不同的类型。一旦我掌握了这一点,所有其他的?!疯狂的,以及下面的伟大答案,都变得更有意义了。

0 投票
2 回答
3343 浏览

swift - AnyObject的返回值如何!不同于任何对象

Swift 下 Cocoa 框架中的NSMetadataItem类包含如下函数:

func valueForAttribute(key: String!) -> AnyObject!

我仍在学习强制展开和可选链接之间的区别(和细节)。在上述函数中,这是否意味着:

  1. key参数必须有一个值,并且

  2. 返回值保证有值?

我主要关心的是返回值后面的感叹号- 一旦我分配了返回值:

检查时是否需要包含一个if let块,或者我是否保证它具有我可以安全检查的值?

0 投票
3 回答
16654 浏览

swift - 将强制向下转换视为可选将永远不会产生“零”

我一直在玩 Swift,发现当向下转换要插入字典的对象时,我收到一个奇怪的警告:Treating a forced downcast to 'String' as optional will never produce 'nil'. 如果我替换as为,as?则警告消失。

苹果的文档说以下

因为向下转换可能会失败,所以类型转换运算符有两种不同的形式。可选形式 ,as?返回您尝试向下转换为的类型的可选值。强制形式 ,as尝试向下转换并将结果强制展开为单个复合动作。

我不清楚为什么在这里使用as?而不是as正确的。一些测试表明,如果我将 test() 更改为返回 Int 而不是 String,如果我继续使用as. 如果我切换到使用,as?那么代码将继续正常执行并跳过该语句(dict 将保持为空)。但是,我不确定为什么这是可取的。在我看来,我宁愿程序因错误而退出并让我知道强制转换不成功,然后简单地忽略错误语句并继续执行。

根据文档,我应该使用强制形式“只有当你确定向下转换总是会成功时”。在这种情况下,我确信向下转换总是会成功,因为我知道test()只能返回一个字符串,所以我认为这是强制向下转换形式的完美情况。那么为什么编译器会给我一个警告呢?

0 投票
2 回答
925 浏览

swift - 强制解包的目的

在 swift 文档中,您可以找到:

有了这个解释

一旦您确定可选项确实包含一个值,您可以通过在可选项名称的末尾添加一个感叹号 (!) 来访问其基础值。感叹号有效地表示,“我知道这个可选的肯定是有价值的;请使用它。” 这被称为强制解包可选值:

好的,明白了,但它有什么用处?如果我不强制解包,情况就不一样了:

谢谢你启发我:)

0 投票
1 回答
2359 浏览

coding-style - Swift 的早期回归/黄金之路

我习惯于在 Objective-C 中编写具有早期返回/黄金路径的代码。!我在 Swift 中尝试了这种方法,并注意到当涉及可选时,提前返回是以使用强制展开运算符 ( ) 为代价的。

采取一种计算目录大小的方法。一、黄金之路版本:

请注意我如何将!运算符用于contentsattributes变量。

我假设过度使用!运算符会破坏选项的目的以及它们带来的类型安全性。这就是我觉得上述方法应该在 Swift 中编码以避免强制展开的方式:

但是,通过使用if let我不能再提前返回。如果有些方法不使用提前返回而有些方法使用,那么我最终会得到一个混合编码风格的项目。

我的问题是,有没有办法以黄金路径风格编码,而无需在涉及选项时强制展开?

0 投票
1 回答
132 浏览

javascript - 使用 jquery 解开视频标签

我有这个:

我必须解开这个视频标签,所以我尝试了:

控制台窗口中的结果是:

有什么线索吗?

非常感谢!

0 投票
1 回答
596 浏览

ios - Swift Optionals - 不同的展开方式

我会直接说:

有什么区别:

两者都在操场上输出相同的结果。

我知道隐式展开不被认为是安全的(在大多数情况下)但是,在这里我在展开之前检查这些值是否为零?

两种方法都有效吗?是否存在不同的场景,其中一种被认为是更好的选择?

0 投票
1 回答
35 浏览

ios - 为什么我不能以这种方式在我的 [( String, [ProtocolType] )] 中插入 (String, [ProtocolConformer]) 元组?

我在操场上浓缩了我的问题场景:

为什么这里不接受强制解包?

Xcode 6.1.1

0 投票
1 回答
662 浏览

ios - 从字典中展开可选类型 Any

我之前曾问过一个与此类似的问题,但答案似乎不起作用。

我有一本名为 Settings 的字典:

var settings = 字符串:任意

这是通过阅读文本文件填充的 - 一切正常

当我运行println(settings)它时,它会返回填充的字典。

[monsterRate: 1.0, monsterMinSpeed: 10.0, weaponPickupRate: 10.0, weaponPickupAmount: 50.0, goldPerMonster: 10.0, totalMonsters: 10.0, LevelNum: 1.0, monsterMaxSpeed: 15.0]

如果我运行println(settings["monsterMinSpeed"])它返回Optional("10.0")

但是,当我尝试将变量设置为字典包含的值时,它不起作用:

即使字典中有值,它总是使用 0.0,就好像我提供的键不存在一样 - 返回 nil 并因此将变量设置为 0.0

有人可以帮忙吗?

0 投票
3 回答
1033 浏览

swift - 可选和强制展开之间的区别

下面是变量名 yourname 和 yourname2 的可选字符串的代码。

实际上,它们之间有什么区别以及在 yourname2 的情况下如何强制展开