与显式声明为“ImplicitlyUnwrappedOptional”类型的不可变对象的可选绑定会生成“Optional”类型的不可变对象

2024-03-14

背景

当我解释以下问题中的逻辑错误时:

  • 如何使用guard语句来检测赋值后的nil? https://stackoverflow.com/a/36303241/4573247

我偶然发现了一个我自己无法解释的特性。


详细信息和问题

如上面的线程所示,我们可以显式地声明作用域局部不可变的类型,例如b, in if let b = rhs ... and guard let b = rhs ... else子句与相同的可选类型rhs值(试图分配给)b,在这种情况下,“可选绑定”将始终成功:

let a: Int?

// ...

if let b: Int? = a { // will always succeed, 'Int?' to 'Int?'
    print(b.dynamicType) // Optional<Int>
}

我们可以讨论是否应该允许这样做,因为这本质上是一个臃肿的块本地分配,但这不是这个问题的重点。相反,解释以下特性:

  • 如果我们明确声明b上面是隐式解包的可选类型(这里:Int!), then b在范围内if let由于某种原因,子句只是一个常规的非解包可选,即Int.

    let a: Int? = nil
    if let b: Int! = a {
        print(b.dynamicType) // Optional<Int>
            /* why not ImplicitlyUnwrappedOptional<Int> ? */
    }
    

问题:

  • Why is b上面——声明为隐式解包的可选(Int!)—转换为“常规”可选 (Int?) (在里面if let条款)?

我自己的调查

我只是注意到,对于隐式解包选项的常规赋值,上面的“影子转换”自然不存在

let c: Int? = 10
let d: Int! = c
print(f.dynamicType) // ImplicitlyUnwrappedOptional<Int>

如果我们使用总是成功的,则两者都不存在if let来自非可选的块本地分配(Int) 隐式解包可选 (Int!)

let c = 10
if let d: Int! = c {
    print(d.dynamicType) // ImplicitlyUnwrappedOptional<Int>
}   

在下面的评论中得到 @Sulthan 的反馈后,我们发现如果a上面是一个双重可选(Int??), e.g.

let a: Int?? = 10
if let b: Int! = a {
    print(b.dynamicType) // ImplicitlyUnwrappedOptional<Int>
}
if let b: Int? = a {
    print(b.dynamicType) // Optional<Int>
}

我正在使用 Swift 2.2 / Xcode 7.3。


None

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

与显式声明为“ImplicitlyUnwrappedOptional”类型的不可变对象的可选绑定会生成“Optional”类型的不可变对象 的相关文章

随机推荐

  • 加载逗号后空格不一致的 CSV 文件

    我想使用加载 CSV 文件LOAD DATA INFILE命令 但逗号后面的空格不一致 即有些逗号后面跟着空格 有些逗号后面没有空格 我尝试使用FIELDS TERMINATED BY 指令 但结果表中的某些字段包含前导空格 如果输入是 a
  • 如何将我自己的存储库分叉到新项目中?

    我正在开发一个 HTML5 游戏引擎 我使用 Git 作为 SV 并使用 GitHub 来实际托管该项目 我在设计上做了一些实质性的改变 主要是切换到实体系统范例 我认为是时候换一个新引擎了 我想将它建立在旧引擎的基础上 因为我可以使用很多
  • Javascript:添加动态方法的更好方法?

    我想知道是否有更好的方法向现有对象添加动态方法 基本上 我试图动态地组装新方法 然后将它们附加到现有函数中 该演示代码有效 builder function fn methods method builder for p in method
  • 加载 JSON 文件时出现内存错误

    当我加载 500Mo 大的 JSON 文件时 Python 和间谍程序 返回 MemoryError 但我的电脑有 32Go RAM 当我尝试加载它时 spyder 显示的 内存 从 15 变为 19 看来我应该有更多的空间 有什么我没想到
  • 将网络抓取的响应保存为 csv 文件

    我从网站下载了一个文件rvest 如何将回复另存为csv file Step 1 猴子补丁rvest像这个线程中的包 如何在 Rvest 包中提交登录表单 不带按钮参数 https stackoverflow com questions 3
  • 如何在silverlight3.0中播放Youtube视频

    我正在开发一个 silverlight 应用程序 我想在其中播放 youtube 视频 任何建议请 可供参考的任何示例或任何链接 提前致谢 这里有一个关于这个问题的有趣主题 其中包含 SL 3 0 beta 中的一些示例 http silv
  • 在简单的 main() 中获取rawinputdata

    我正在尝试使用简单的 C 技术和 Windows 从操纵杆读取值 我的目标是编写一个程序 每当操纵杆信号超过预定义阈值时 该程序就会发送键盘命令 键盘命令将由当时处于活动状态的窗口拾取 我的 C 编码技能有限 因此我希望以最简单的方式完成此
  • 如何将 Tomcat 重写阀添加到 Spring Boot 2.0 应用程序

    我正在尝试在 Spring Boot 应用程序中使用 Tomcat 重写阀 但是无法确定将 rewrite conf 放在哪里才能成功加载 我将 Spring Boot 2 0 3 RELEASE 与 Tomcat 8 5 31 一起使用
  • 以编程方式更改图像分辨率

    我计算过 如果我希望生成的图像为 A4 尺寸 600dpi 用于打印目的 则需要为 7016x4961px 72dpi 所以 我以编程方式生成它 然后在 Photoshop 中测试它 它似乎很好 所以如果我调整它的大小 它会获得正确的大小和
  • 如何让FlatList充满高度?

    import React from react import SafeAreaView KeyboardAvoidingView FlatList View Text TextInput Button StyleSheet from rea
  • 配置 grunt 复制任务以排除文件/文件夹

    我已经安装了 grunt 任务grunt contrib copy 我把它嵌入到我的Gruntfile js并通过加载任务grunt loadNpmTasks grunt contrib copy 目前 我使用以下配置来创建一个包含 js
  • 类在需要新实例的地方保留以前的内容

    我定义了一个类 以及一个创建该类实例的函数 我认为这个函数应该每次都创建一个新实例 然而 它看起来像是 继承 了上次调用的内容 任何人都可以解释一下吗 谢谢 class test a def b self x self a append x
  • iframe shimming 或 ie6(及更低版本)选择 z-index 错误

    嗯 不知道有没有人遇到过这个问题简要说明是关于 IE6 的任何
  • constexpr 和奇怪的错误

    我有 constexpr bool is concurrency selected const return ConcurrentGBx gt isChecked GBx is a groupbox with checkbox 我收到错误
  • Backbone.js 事件处理程序命名的最佳实践

    假设我在视图中有一个函数 当某种状态发生更改时会触发该函数 最好给它起什么名字 为什么 状态改变 状态改变 状态改变时 状态改变时 我个人更喜欢使用onEventName名称保持 DOM 事件处理程序的本机命名约定 Like myEleme
  • 如何将Javascript的window.find限制为特定的DIV?

    是否可以在 Safari Firefox Chrome 中使用 Javascript 在特定的 div 容器中搜索给定的文本字符串 我知道你可以使用window find str 搜索整个页面 但是否可以将搜索区域限制为仅在 div 内 T
  • IntelliJ Idea groovy.lang.GroovyRuntimeException:模块版本冲突

    我的 Maven 构建很好 并且能够从 cli 运行 groovy 但是 如果我尝试在 IntelliJ Idea 版本 15 社区版 中运行我的 groovy 类 则会出现以下错误 Exception in thread main jav
  • PyTorch 中的截断反向传播(代码检查)

    我正在尝试在 PyTorch 中实现随时间截断的反向传播 对于以下简单情况K1 K2 我下面有一个实现可以产生合理的输出 但我只是想确保它是正确的 当我在网上查找 TBTT 的 PyTorch 示例时 它们在分离隐藏状态 将梯度归零以及这些
  • 使用命令行参数从 C# 执行 PowerShell 脚本

    我需要从 C 中执行 PowerShell 脚本 该脚本需要命令行参数 这是我到目前为止所做的 RunspaceConfiguration runspaceConfiguration RunspaceConfiguration Create
  • 与显式声明为“ImplicitlyUnwrappedOptional”类型的不可变对象的可选绑定会生成“Optional”类型的不可变对象

    背景 当我解释以下问题中的逻辑错误时 如何使用guard语句来检测赋值后的nil https stackoverflow com a 36303241 4573247 我偶然发现了一个我自己无法解释的特性 详细信息和问题 如上面的线程所示