Swift 可选 - 不一致?

2024-02-12

我有点困惑 - 我以为我理解Options,并且在Apple开发论坛Chris L上提到解决不可变Optional问题的方法是为可选值类型创建一个类包装器。 -link https://devforums.apple.com/message/998882#998882%20%20(I%20thought%20implying%20that%20class/reference%20type%20optionals%20properties%20are%20mutable!

然而,以 UIWindow 为例(具有各种属性的可选类类型)

通过可选链接,这些属性似乎仍然不可变!

var window: UIWindow?

//this works (force unwrap)
self.window!.backgroundColor = UIColor.greenColor()


//this optional chain doesn't work... why not? Isn't this just a safer version of the above?
self.window?.backgroundColor = UIColor.redColor()

这似乎在 beta 5 中得到了修复!


Xcode beta 5 更新


最初提出的问题已在 Xcode beta5 中解决,这可能会使这个答案无效。


原答案


这可能需要进一步解释,为什么它肯定是不不一致行为但简单无效。

可选的value必须始终是right实际操作数一侧,并且不能位于left它的一侧。

通过两个简单的例子看看这个逻辑:

示例1

如果是这行代码:

self.window?.backgroundColor = UIColor.redColor()
                      < LEFT ^ RIGHT >

可选的位于left一边这意味着left侧面可能是nil因此,在运行时,以下操作数将出现在此处:

nil = UIColor.redColor()

如果没有任何进一步或复杂的解释,这在每个层面上显然都是无效的 -nil不能分配给其他东西,这就是编译器不允许它的原因。

NOTE:您可能会假设在以下情况下逻辑行为会是这样的self.window = nil:

nil.backgroundColor = UIColor.redColor()

但有关的文档可选链接 https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html强调了一个非常重要的行为,它解释了为什么这种情况根本没有发生:

多个查询可以链接在一起,并且entire如果链中的任何环节被破坏,链就会优雅地失败nil.

重点是这个词"entire",这就是为什么left侧面将是nil = ... and not nil.backgroundColor = ...正如你所期望的Objective-C.

示例2

另一个答案强调了如何解决它的另一个想法:

self.window?.setBackgroundColor(UIColor.redColor())

为什么这样有效?这里会不会有点不一致?当然不。

实际的可选是在right此处操作数的一侧,因为该行等于该行,但是我们不费心去获取void在实践中根本没有。

let result: Void! = self.window?.setBackgroundColor(UIColor.redColor())
           < LEFT ^ RIGHT >

as you see there is not any inconsistency at all here, because in the case of self.window = nil that line would be equal to this one in runtime (please see the explanation above):

let result: Void! = nil

这将是一个完全合法的操作数。

逻辑很简单,可选必须始终位于right操作数(或运算符)的一侧,在left侧面它可以是非可选的value only.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 可选 - 不一致? 的相关文章

  • 从 Firestore Swift 获取文档 ID

    我正在尝试从中获取文档IDFirestore通过执行这样的查询 func updateStatusInFirestore let orderid saleOrder first Orderid print orderid let setti
  • 无法在 Swift 中创建文件路径

    我尝试在 Swift 中打开该文件 为此 我创建了文件路径 这不起作用 maaaacy pwd Users tsypa maaaacy cat a txt test maaaacy a swift nil maaaacy 剧本 usr bi
  • 如何快速从解析中加载图像?

    我想知道是否有人可以帮助我 我是应用程序开发的新手 我正在从我的应用程序上传图像以在解析文档的帮助下毫无问题地进行解析 let imageData UIImagePNGRepresentation scaledImage let image
  • 方法调用中的插入符[重复]

    这个问题在这里已经有答案了 我正在阅读本教程 并遇到了这行代码 这让我感到困惑 localSearch startWithCompletionHandler MKLocalSearchResponse response NSError er
  • 了解 React Native 中的默认字体大小

    在过去的几个月里 我一直在开发一个 React Native 应用程序 但有些事情总是让我困惑 而我现在正试图弄清楚它的真相 我正在尝试标准化应用程序中的字体大小 正文 标题等 并且正在努力了解 React Native 究竟从哪里获取默认
  • 使用 iPhone 控制蓝牙音频设备

    我正在寻找为 iPhone 编写应用程序 它将能够控制汽车中的收音机和 CD 播放器 收音机和播放器具有可用的蓝牙连接 我开始这个问题是为了获得这个地方所需的所有信息 我有几个问题 但如果您发现任何我没有要求的对我开始开发此应用程序不重要的
  • 如何使用存储在 Cocoa Touch 框架中的 Localized.strings?

    我想为 CocoaTouch 框架添加多语言支持 问题 可本地化的字符串我创建的文件仅被使用NSLocalizedString当它是主应用程序及其目标的一部分时 我想将其存储在框架内以将事物分开 我怎样才能使用可本地化的字符串当放置在 Co
  • 在 SwiftUI 中,如何执行手势但将手势转发到其后面的视图?

    我正在创建一个工具提示系统 如果用户触摸工具提示之外的任何地方 我想关闭工具提示 我希望这样在工具提示之外的触摸既可以消除工具提示 又可以激活用户点击的任何控件 因此 您可以打开一个工具提示 然后仍然单击工具提示外部的按钮 并在第一次点击时
  • 在 Firebase 中为 TextView Swift 保存字体和大小的方法是什么

    我想在 Firebase 中保存 Swift 中 TextView 的字体 大小和对齐方式 这样我就可以在另一个视图中调用它 我只能将颜色保存在 Firebase 中 这是显示我是如何做到的的代码 IBAction func SendBtn
  • 如何在 iOS 中设置视图的最大宽度?

    我的应用程序有一个基本的登录屏幕 一个外框以及其中的一些文本字段和按钮 我将框设置为填满屏幕 然而 在某些设备上这个盒子会太大 如何设置视图的最大宽度和高度 您可以使用自动布局约束 使框适应屏幕尺寸 但不超过给定的宽度和高度 为此 请对宽度
  • 将 UIRefreshControl 用于 UIWebView

    我在 iOS 6 中看到了 UIRefreshControl 我的问题是是否可以通过下拉来刷新 WebView 而不是像在邮件中那样让它弹出 我使用 rabih 的代码是 WebView UIRefreshControl refreshCo
  • ExpandableLabel iOS 中的“少看”

    我正在使用第三方库可扩展标签 https github com apploft ExpandableLabel实施一个see more特征 我正在寻找仅快速的解决方案 其中包含标签中的文本而不是按钮中的文本 因此这可以完美地工作 添加库并更
  • 如何避免 NSNumberFormatter 中的四舍五入

    我试图拥有一个最大精度为 2 位小数的数字字符串 而其余小数只是被修剪掉而不是四舍五入 例如 I have 123456 9964 I want 123456 99 gt Just want to trim rest of the deci
  • 尝试注册 RCTBridgeModule 类 RCTFileReaderModule

    尝试为名称 FileReaderModule 注册 RCTBridgeModule 类 RCTFileReaderModule 但该名称已由类 FileReaderModule 注册 尝试使用命令react native run ios在i
  • 调用了 numberOfRowsInSection 但未调用 cellForRowAtIndexPath

    在我的表视图中节中的行数被调用两次但是cellForRowAtIndexPath不叫 我想在 tableView 中显示 Facebook 好友列表 如果 cellForRowAtIndexPath 调用我的问题就解决了 我在这里的数组中得
  • SwiftUI - 从 NSObject 继承的 ObservableObject 在 iOS 13 中不会更新

    我知道 这是 无法在 iOS XX 中工作 问题之一 但我完全陷入困境 所以我有一个ObservableObject继承自的类NSObject 因为我需要听委托方法UISearchResultsUpdating class SearchBa
  • 禁用 iPhone 4S / 新 iPad 键盘上的听写按钮

    我们的应用程序是一个医疗保健应用程序 我们的应用程序中有一个符合 HIPAA 标准的语音识别器 所有听写都可以通过它进行 医院不希望医生意外开始与不符合 HIPAA 标准的 Nuance Dragon 服务器进行对话 因此 我正在寻找可以抑
  • iOS 键盘显示后分屏宽度

    我刚刚开始研究 Cordova 应用程序对分屏多任务处理的支持 到目前为止 该应用程序在模拟器中的 iPad 上显示和调整大小都很好 但是当我单击编辑字段并显示软件键盘时 100 宽度的值开始返回整个屏幕 而不是给出的窗口 初始显示 到目前
  • 如何像谷歌日历一样将单元格的内容滚动到表格视图中的另一个单元格中?

    我希望用户界面像谷歌日历那样进入桌面视图 它在不同的行中显示相同的日期事件 但是当您向上或向下滚动时 左侧的日期也会向上向下滚动 Can you please help me how to achieve this Please take
  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo

随机推荐

  • 当 Markdown 包含水平线时,“生成 PDF 时出错”: --- 或 ***

    当我的 Markdown 文件包含水平线 或 时 我收到有关 Linethickness gt Protect 的错误 我知道最近 MiKTeX 出现了问题 但我不确定它们是否适用于此 从昨天早上开始 我就一直遇到这个问题 当时我正在尝试让
  • Android 底部导航 Activity 在 onCreate 中出现空指针异常

    我向我的项目添加了一个底部导航活动 但是当我启动相关活动时 它给出了空指针异常 它说异常是在第 28 行触发的 在 lk apiit eea mobile Activities CompanyProfile onCreate Company
  • PHP:获取关联数组的第n项

    如果你有一个关联数组 Array uid gt Marvelous status gt 1 set later gt Array 0 gt 1 1 gt 0 op gt Submit submit gt Submit 如果您想访问第二项 您
  • 在特定桌面上启动进程

    如何在特定的 Windows 桌面上启动 Windows 进程 最好 我们正在寻找一种在 Windows 8 1 上也支持的解决方案 即不依赖于 Windows 10 的新任务视图功能 我知道 用户在 Windows 8 1 中不容易访问不
  • 使用 Backbone Marionette 使用现有渲染的 HTML 显示视图

    我有一个像所附的应用程序布局 上面的面板已经到了页面 即在服务器的 HTML 响应中 当用户与该面板中的元素交互时 下面的动态面板的内容会相应地发生变化 我研究了 Backbone Marionette 的各种视图类型和区域管理器 但我仍然
  • 更改 OS X 菜单栏中 Tkinter 应用程序的标题

    当您在 Python 中使用 Tkinter 创建带有 GUI 的应用程序时 应用程序的名称在 OS X 的菜单栏中显示为 Python 如何才能让它显示为其他内容 我的答案是基于埋在中间的一个一些论坛 http compgroups ne
  • statespace.SARIMAX模型:为什么模型使用所有数据来训练模式,并预测训练模型的范围

    我按照教程研究了SARIMAX模型 https www digitalocean com community tutorials a guide to time series forecasting with arima in python
  • Dagger 2 活动注入不起作用

    我正在尝试新的 dagger 2 这是我第一次实现它 但我无法让它工作 我想我已经明白了这个概念并且理解了这个例子here https github com LiveTyping u2020 mvp 我尝试复制相同的结构 只是针对我的示例进
  • Java Process.waitFor() 和 Readline 挂起

    首先 这是我的代码 import java io import java util Date import com banctecmtl ca vlp shared exceptions public class PowershellTes
  • elasticsearch有复合索引吗?

    我想知道elasticsearch是否需要预先定义复合索引 通过复合索引 我的意思是类似于 mongodb 的东西 db collection ensureIndex 字段1 1 字段2 1 字段3 1 或者类似于 mysql db 的东西
  • 有什么方法可以控制 NavigationView 标头内的视图吗?

    正如标题所说 我想知道是否有什么方法可以控制内部的视图NavigationView标题 添加或删除标头除外 例如 在标题中 我有一个用户头像 默认情况下 它显示访客图像 但用户登录后 将显示真实头像 如何才能做到这一点 将支持库更新到版本
  • 如何在单个视图中实现两个片段?

    我有一个包含 3 个片段的应用程序 而且viewpager 工作得很好 但我需要像 Android Play 商店中那样实现类似的视图 最初他们有 特色 选项卡 当您向左滑动时 我们可以看到 类别 选项卡 但一半的屏幕仍然充满了 精选 选项
  • 在单独的线程中运行异步循环,信号来自和循环

    我正在尝试制作一个在后台与多个 BLE 设备进行通信的 UI 为此 我实现了一个运行 asyncio loop 的单独线程 这是必要的 因为我使用 bleak 0 9 1 连接到设备 使用信号和槽将数据从 UI 线程获取到工作线程效果很好
  • iOS 5.1 和 Xcode 4.3.1 CodeSign 错误

    我刚刚下载了 iOS 5 1 和 Xcode 4 3 1 但是当我要在我的设备中进行测试时 Xcode 给出了错误 CodeSign 错误 SDK iOS 5 1 中的产品类型 应用程序 需要代码签名 知道如何修复它吗 尝试在每个字段中分配
  • 管理 web.config 文件

    我有 3 个环境 NET 4 上的 Dev QA Prod 每个环境都有一个唯一的 web config 文件 我们在管理所有三个版本时遇到了问题 在 TFS 中手动合并 web config 文件时 很容易忽略一些关键的东西 我们不止一次
  • 尽可能快地打开和读取数千个文件

    我需要尽快打开和读取数千个文件 我对 13 592 个文件进行了一些测试 发现方法 1 比方法 2 稍快 这些文件通常在 800 字节到 4kB 之间 我想知道是否可以做些什么来使这个 I O 密集的过程更快 Method 1 Run 1
  • 使用行/列索引对栅格进行子集化

    当对矩阵或 DF 进行子集化时 可以引用行列 例如df1 1 5 3 10 or df3 2 4 有没有办法用光栅来做到这一点 也就是说 我可以只剪辑第 500 700 行 例如从光栅对象中剪辑吗 我尝试过使用rasterFromCells
  • 使用 PyPlot 时出现 Julia 运行时错误

    如果我尝试在 Windows 8 1 上使用 Julia 0 6 0 使用 Plots 或 PyPlot 绘制任何内容 我会收到运行时错误消息 运行时错误 程序 C Users c AppData Local Julia 0 6 0 bin
  • 如何让express从另一个上层目录提供静态文件?

    如果我有一个具有以下文件夹结构的 Nodejs Express 应用程序 src client public css js views server server js 如何从 server js 文件中提供公共文件夹中的静态文件 因为它位
  • Swift 可选 - 不一致?

    我有点困惑 我以为我理解Options 并且在Apple开发论坛Chris L上提到解决不可变Optional问题的方法是为可选值类型创建一个类包装器 link https devforums apple com message 99888