隐式解包的选项真的是可选的吗?

2024-01-09

在 Swift 4.0 中,以下代码无法编译:

var str: String!
func someFunc(_ s: inout String?) {}
someFunc(&str)

现在我想象str属于类型String?事实上,Swift 编译器似乎也同意:

无法传递“String”类型的不可变值?作为 inout 参数

我可以通过将变量更改为类型来解决此问题String?或函数参数(_ s: inout String!)但我不明白为什么我必须这样做。斯威夫特似乎已经同意这一点var str : String!是“‘String 类型?’”——那么为什么它不让我把它传递到这里呢?

是否还有另一个选项可以用来隐式展开我的变量,但仍将其传递给修改可选值的函数?

I tried someFunc(&(str?)) and that just makes things weirder — then Swift complains:

无法传递“String!”类型的不可变值作为 inout 参数”。

So str is a String?但不能作为String?, while str? is a String!?!


这是一个swift 编译器中的已知错误 https://bugs.swift.org/browse/SR-3512. 哈米什在评论中说 https://stackoverflow.com/questions/48814508/are-implicitly-unwrapped-optionals-truly-optionals#comment84633455_48814508这在 Swift 4.1 快照中已修复,因此可能会在下一个 Xcode 版本 (9.3) 中修复。

您可以通过摆脱隐式解包可选 (IUO) 来解决此问题,无论如何都应该避免这种情况。根据当前为 IUO 的原因,可以是:

var str: String?
func someFunc(_ x: inout String?) {}
someFunc(&str)

or

var tmp: String?
func someFunc(_ x: inout String?) {}
someFunc(&tmp)
let str = tmp!

我强烈建议第一点,除非绝对必要,否则避免强行展开。

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

隐式解包的选项真的是可选的吗? 的相关文章

  • 有关 UnsafeMutablePointer 的 destroy() 的术语

    Destroy the object the pointer points to Precondition the memory is initialized Postcondition the value has been destroy
  • Swift 3 中来自路径或文件名的 UIImage

    我的应用程序的文档目录中有一堆图像 我想将其中之一加载到我认为的 UIImage 中 这就是我所做的 myImage image UIImage named image jpg the file exist but this returns
  • 使用 Swift 过滤 Realm 对象

    尝试使用以下方法过滤我的领域数据库时 我总是收到以下错误NSPredicate 属性 text 不是类型 getType 对象中的链接 我想过滤我的领域数据库以仅显示其中包含某些特定文本的项目 这是我尝试过的 let realm try R
  • UITableView 干扰状态栏

    我正在开发一个具有 UITableViewController 的应用程序 该应用程序显示值列表 如下所示 如何将表格向下移动 使其不会与状态栏冲突 看来我无法对这个场景施加任何限制 所以我不知所措 使用以下 3 个属性UIViewCont
  • xcode 9 中的 Facebook 登录按钮终止

    我正在使用 Xcode 9 并将编译器设置为 Swift 3 2 我使用 Cocoapods 安装了 Facebook Login 一切都编译没有任何错误 但每当我在模拟器中运行它时 我单击登录按钮 它就会崩溃 控制台中仅打印以下内容 li
  • Swift UIToolBar 追加 UIBarButtonItem 项目

    我的语法不正确 有人知道这里缺少什么吗 我正在使用 Xcode 6 beta 3 并且尝试将工具栏项动态添加到 viewDidLoad 中的 手动添加的 工具栏 有两个问题 首先 我无法将工具栏中的项目附加到数组中 其次 虽然编译器允许我调
  • AVAssetExportSession.requestExportSession 回调从未被调用(swift 3,iOS10)

    以下代码从不调用导出回调 导出会话创建得很好 我没有看到任何错误 也没有任何进展 CPU 为 0 我认为没有例外 状态为 1 进行中 进度为 0 错误为零 视频在画廊中播放 我可以成功获取视频的图像 我已将代码提取到单个 UIViewCon
  • 如何以编程方式创建 Unwind segue

    我制作了一个不使用故事板的应用程序 在我的应用程序的这一部分中 我需要创建一个展开转场ThirdViewController to FirstViewController仅以编程方式 我知道如何使用 sotorybard 执行此操作 但找不
  • 动态获取协议的字符串表示形式

    我正在寻找一种从协议类型动态获取协议名称的方法 而不必使用 objc协议声明中的属性 我知道这有效 func keyForProtocol aProtocol Protocol gt String return NSStringFromPr
  • 如何从 UITableViewController 中的静态单元格获取文本字段?迅速

    我的视图层次结构如下所示 UIViewController 类型的 ElevethViewController容器视图嵌入容器视图中的 UITableViewController 类型的 ManagedTableEleventhViewCo
  • 扩展功能截图未捕获 iPhone 和 iPad 中的同一区域

    我正在使用扩展函数来截取 uiview 的屏幕截图 问题是结果看起来非常不同 我希望无论使用 ipad 还是 iphone 照片看起来都一样 我手动输入约束 因此我希望图像是相同的 我想使用该函数转到视图控制器的原点或中心 高度为 200
  • Core Data + CloudKit 无法在其他设备上自动刷新?

    我的 SwiftUI 应用程序与 Core Data CloudKit 一起使用 我可以从 Mac 或 iPhone 将新条目保存到数据库中 该应用程序对所有设备使用完全相同的项目 代码库 唯一的问题是我需要关闭应用程序并重新打开它才能查看
  • Swift 中带有数组的 For-In 循环中迭代器元素的可变性

    我在 Swift 3 0 中有一些代码 就像这样尝试更新元素数组中的属性 for point in listOfPoints var pointInFrame Float Float point position x sensorIncom
  • 使用 Swift 导入 aurioTouch 库

    我正在尝试将 Objective C 应用程序转换为 swift 我想导入课程奥里奥触摸 https developer apple com library ios samplecode aurioTouch Introduction In
  • 在单个 MTLRenderCommandEncoder 中使用多个渲染管道:如何同步 MTLBuffer?

    中心议题我在一个渲染命令编码器中有两个渲染管道 第一个管道写入第二个管道中使用的缓冲区 这似乎不起作用 我预计这是一个同步问题 当我为每个渲染管道使用一个单独的渲染命令编码器时 我得到了所需的结果 可以使用一个渲染命令编码器来解决这个问题
  • 按钮图像未显示在 UItextfield 的 rightView 中

    我创建了一个按钮图像 并使用 Sa wift 将其放置在 UITextField 密码 的 rightView 上 我想在密码字段中创建切换按钮隐藏 显示安全文本 右视图中显示的图像 Code func passwordToggleButt
  • 将字符串编码为 HTML 字符串 Swift 3

    如何快速编码字符串以删除所有特殊字符并将其替换为其匹配的 html 编号 假设我有以下字符串 var mystring This is my String That s it 然后用它的html编号替换特殊字符 38 39 gt 62 但我
  • 搜索结果中的 Swift 搜索结果控制器连接到另一个视图控制器

    Problem 我有一个表格视图 用户可以滚动查找某些内容或使用搜索栏 搜索栏不是使用 StoryBoard 创建的 我的观点有一个UISearchController处理搜索栏和搜索结果更新 我遇到的问题是 自从我SearchResult
  • 使用 Codable 将字符串编码/解码为整数,并在其间使用函数

    我有这个 json 字符串 let json name Wendy Carlos hexA 7AE147AF hexB 851EB851 let data Data json utf8 我想使用 Codable 对该结构进行编码 或返回 s
  • Swift 3 Web 视图

    所以我刚刚更新到新的Xcode8 and Swift3但现在我的网络视图不起作用 这是我使用的代码 UIWebView loadRequest webView NSURLRequest URL NSURL string http hardw

随机推荐

  • 如何在 Postgres 中获取时间间隔的平均值

    我正在使用 PostgreSQL 9 6 我有一个这样的表 mac sn loc time date vin1 vin2 vin3 1a34 4as11111111 aaaa 7 06 18 1 1 2018 447 42 472 32 6
  • 如何从 xcode 获取自己的应用程序版本?

    我想知道是否有办法在将其放入 xCode 中的 Summary 选项卡后 在代码中获取自己的应用程序版本 一种方法似乎是搜索Info plist for CFBundleVersion关键 但是还有其他更简单 更方便的方法吗 您可以在主包中
  • VB.NET LINQ 按多列分组

    我有以下 LINQ 代码 该代码有语法错误 但我不知道如何修复它 Dim query From row In mainDatatable AsEnumerable the syntax Error is in the following l
  • 保持当前页面呈现,直到加载下一页

    我有一个基于 WebView loadUrl http www example com http www example com 当用户单击 URL 时 默认行为是立即显示空白页面 等待页面加载 然后显示此页面 我设法显示启动屏幕来代替空白
  • POSIX TIMER - 有多个计时器

    我试图在我的系统中有两个计时器用于两个不同的目的 但我不明白为什么它不起作用 有人可以帮助我吗 另外 处理程序代码是否应该是最低限度的 以便任务本身不会干扰滴答声 我还可以定义单独的处理程序吗 include
  • 如何在客户注册表中添加地址字段?

    我使用的是magento 1 6 我想在客户注册表上显示地址字段 我从 register phtml 中删除了以下几行 但它不起作用 所以我该怎么做 如果您使用的是 magento 1 6 或更高版本 并且只需在customers form
  • One-hot 编码多级列数据

    我有以下数据框 其中包含有关不同主题的特征的记录 ID Feature 1 A 1 B 2 A 1 A 3 B 3 B 1 C 2 C 3 D 我想获得另一个 聚合的 数据帧 其中每一行代表一个特定主题 并且有所有单热编码功能的详尽列表 I
  • Cordova 应用程序可以编译,但在运行时崩溃。如何获取错误报告?

    我有一个 Cordova 应用程序 编译时没有错误 然而 当我将应用程序加载到我的 Android 设备上时 它在启动时立即崩溃 当我不知道错误是什么时 我很难进行调试 问题 有没有办法从这次崩溃中获取错误报告 我通常使用 Chrome 来
  • 在哪里以及如何安装 ArcPy for Python 2.7?

    我检查过http www lfd uci edu gohlke pythonlibs http www lfd uci edu gohlke pythonlibs http help arcgis com en arcgisdesktop
  • 如何在 for 循环中追加 pandas 数据框中的行? [复制]

    这个问题在这里已经有答案了 我有以下 for 循环 for i in links data urllib2 urlopen str i read data json loads data data pd DataFrame data ite
  • 如何在 Vim 中进行类似于“grep -w”的全字搜索

    我如何进行全字搜索 例如grep w在 Vim 中 它只返回所寻找的字符串是整个单词而不是较大单词的一部分的行 grep w 仅选择包含构成整个单词的匹配项的行 这可以在 Vim 中完成吗
  • 数据结构:此类练习中 pop、push、dequeue、enqueue 的解释

    我正在努力熟悉这 4 个概念 所以如果我们有一个数组 15 34 23 32 15 5 我们的业务包括 pop push 30 enqueue 40 dequeue 100 pop 只会删除第一个数字 即 15 对吧 如果是 pop 20
  • 如何同时静默对 Rails 控制器操作的调用

    我已经弄清楚如何通过将操作方法 内的所有内容包装在 logger silence 块中来使操作的内容静音 但是 我仍然收到对日志文件中显示的操作的调用 I E Processing DashboardController update fo
  • 如何从 获取持续时间,如 int milli 和 float 秒?

    我正在尝试使用 chrono 库来设置计时器和持续时间 我希望能够拥有一个Duration frameStart 从应用程序启动 和一个Duration frameDelta 帧之间的时间 我需要能够得到frameDelta持续时间为毫秒和
  • 在 Xamarin.iOS 中创建可扩展的表格视图?

    我正在尝试使用创建可扩展的表格视图Xamarin iOS具有手风琴类型的功能 例如 最初会有一些行 点击任何行 单元格将扩展到表视图中的其他一些行 Thanks 嘿 我制作了一个可扩展表格视图的示例here https github com
  • 我可以使用 OpenCL 分配设备内存并在 CUDA 中使用指向内存的指针吗?

    假设我使用 OpenCL 来管理内存 以便 GPU CPU 之间的内存管理使用相同的代码 但我的计算使用优化的 CUDA 和 CPU 代码 不是 OpenCL 我仍然可以使用 OpenCL 设备内存指针并将它们传递给 CUDA 函数 内核吗
  • 学习正确使用VBO

    因此 我一直在尝试自学使用 VBO 以提高 OpenGL 项目的性能并学习比固定功能渲染更高级的东西 但我还没有找到太多像样的教程 到目前为止我发现的最好的是宋浩的教程 http www songho ca opengl gl vbo ht
  • 修改 beforeFind 回调中所需的 Containable 字段?

    在我的 CakePHP 1 2 5 应用程序中 我有一个Profile模型属于User模型 用户模型有一个username字段 并且当执行find 在 Profile 模型上 我希望始终自动检索User username也 我认为修改我的配
  • Angular2 中组件属性变化的可观察

    当在 Angular 2 中创建一个通过 Input 具有输入属性的组件时 如何从对该属性 Input 所做的更改中获取可观察值 不要与用户表单输入混淆 export class ExampleComponent implement OnC
  • 隐式解包的选项真的是可选的吗?

    在 Swift 4 0 中 以下代码无法编译 var str String func someFunc s inout String someFunc str 现在我想象str属于类型String 事实上 Swift 编译器似乎也同意 无法