问题标签 [swift-optionals]

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 投票
2 回答
179 浏览

swift - Swift 扩展 - 可选

我正在尝试将选项扩展为可读的内容,并且到目前为止实现了这一点:

这样我就可以在可选的情况下调用我的函数,例如:

问题是,我想重用这些函数来返回特定类型,我无法实现或遗漏了一些东西。例如:

我一直在集思广益,希望能得到一些帮助。

谢谢!

0 投票
1 回答
39 浏览

ios - 过滤时如何安全地解开可选项

目前我有一个使用 bam 运算符的代码片段,但它需要被解包:

我尝试使用警卫:

但它会导致错误,“非 void 函数应该返回一个值”

0 投票
2 回答
73 浏览

json - 无法将“NSNull”类型的值转换为“NSString”,然后应用程序崩溃

我们正在尝试创建一个从 API 获取 JSON 的函数。我们知道这给了我们 NIL,但我们不知道为什么会发生错误。我们得到的确切错误信息是

[] 2020-08-01 16:29:26.501199-0400 HEFT [97766:2952325] [] nw_proxy_resolver_create_parsed_array [C1 代理 pac] 评估错误:NSURLErrorDomain:-1003 无法将类型“NSNull”(0x7fff87a92380)的值转换为“NSString” ' (0x7fff87b502e8)。2020-08-01 16:29:26.670549-0400 HEFT [97766:2952139] 无法将“NSNull”(0x7fff87a92380)类型的值转换为“NSString”(0x7fff87b502e8)。(lldb)

我们试图弄乱代码以找到解决方案,并尝试使用其他一些问题,但它们都与我们试图实现的目标无关。

0 投票
1 回答
515 浏览

swift - 添加弱子视图导致iOS14崩溃

我得到了 iOS14 用户的崩溃日志。我可以对此做些什么,还是应该等到 iOS14 正式发布?

这是带有 textField 的 myCustomTableViewCell:

强制解包会导致任何带有 iOS14 的设备崩溃。下面它工作得很好。

这是我的崩溃日志:

0 投票
1 回答
34 浏览

arrays - 如何检查没有条目的数组和有条目的伴随数组?

我正在将一个用 Objective-C 编写的纸牌游戏转移到 Swift。我的手类中有 2 个阵列,大小均为 3,一个持有 3 张并排向下的卡片,另一个持有位于向下卡片顶部的向上卡片。可以播放向上的牌和未覆盖的向下牌,因此数组可能包含一些牌并且有一些元素为零,因为数组单元正在处理牌的实际位置。这些被声明为

在 Objective C 中,下面的代码告诉我是否有一张未覆盖的卡片,运行良好:

但在 Swift 中,我得到“比较 'Card' 类型的非可选值与 'nil' 总是返回 false”

我对 Swift 很陌生,不知道如何以不同的方式声明数组或使用可选项和解包来检查丢失的卡片(换句话说,nil)。

0 投票
1 回答
68 浏览

swift - 保护后强制展开

有人告诉我我的代码包含很多强制展开。如果我确定操作的值不会为零,我认为可以这样做:

看起来不错吗?如果没有,应该怎么做?

0 投票
1 回答
118 浏览

ios - 未包装的 URLRequest 始终为 nil

我正在尝试检测对 WKWebView 中链接的点击并在另一个 WKWebView 中加载相应的 URL。我能够获取点击的 URL 并创建 URL 请求,但加载 URLRequest 总是失败并出现相同的错误:

致命错误:在隐式展开 Optional 值时意外发现 nil。

这很奇怪,因为当我打印 URLRequest 变量的值时,我可以看到它根本不是 nil。

欢迎任何帮助。非常感谢。

0 投票
1 回答
160 浏览

ios - 与隐式解包选项的协议一致性

我正在尝试制作一个可以在UILabel、和 上使用的 Swift 协议UITextField,并UITextView结合了它们的textattributedTextfont属性。

然而,不幸的是,这三个类与它们是使用这些属性的可选类型还是隐式展开的可选类型不一致。

例如,如果我创建此协议:

我应用它:

它适用于UITextFieldandUITextView但是UILabelfont属性 is UIFont!and 所以编译器说不UILabel符合MyProtocol.

此外,对于 (), textandattributedText是可选的 ( String?) UILabel,但对于( ) 是UITextField隐式展开的。因此,对于所有三个属性,哪些使用可选项以及哪些使用隐式展开的选项甚至都不一致。UITextViewString!

所以我不得不font在协议中重命名为例如。本质上是上述每个扩展中以下实现uiFont的别名:font

这有点烦人,因为它剥夺了协议的简单性。

在 Swift 论坛上发现这篇文章似乎是同一个问题,并且讨论似乎说这不是它在 Swift 4.2 中的行为方式,但我正在使用 Swift 5 并且仍然得到这个。甚至有人提议废除合并后的IUO 。

注意我在 macOS Catalina 10.15.6 (19G2021) 上使用 Xcode 11.7 和 iOS 13.7。

有什么方法可以完全避免这个问题,或者让代码更简洁一些,这样我就不需要那么多冗余了?

谢谢

0 投票
2 回答
73 浏览

ios - 如何在函数中解开打印的返回选项(练习)

嗨,我正在尝试使用 Apples Fundamentals of Swift 书来学习 Swift。过去有过类似的帖子,但我对答案有一些问题,我想澄清一下。

该帖子是功能和选项练习

我在这个练习中,你应该打印返回值。如果商品的库存为 0,则返回值为 nil,如果库存不为 0,则返回值为 nil。补充一点,我认为关键是如果您返回它而不是 nil,则解开价格值。在早期的练习中,他们让我们解开选项。

如果我 print(purchases(item: "Chips") 我会打印 optional(2.99)。如果它被打开,它不会只是 2.99 吗?我可以在调用函数并强制打开时作弊,但这会破坏重点。

当我尝试安全地打开包装时,我收到一条消息,提示“在预期返回 'Double 的函数中缺少返回?'”

如此:

我可以在 if let 语句之后添加另一个 else return nil ,但是我又回到了包装的可选项。

感谢您的任何回答

0 投票
0 回答
31 浏览

swift - 转换为错误失败,但转换为 NSError 成功

在我的通知的 userInfo 中,有一个错误键,其中包含一个 NSError

但是将其转换为 Error 失败并且 NSError 成功

此代码不通过

此代码通过

除了 Swift 中的一个错误,我认为没有理由这么奇怪?有人可以分享一下吗?