为什么 Swift 不允许非可选类型的弱引用?

2024-01-03

这并不是纯粹的好奇,有一种感觉,我可能误解了 Swift 中弱引用的一些内容。

假设我从视图控制器创建一个类并将其引用传递给初始化程序:

class = MyClass(vc: self)

由于情节提要和窗口已经保留对此视图控制器的引用,因此 MyClass 对它具有弱引用似乎是合乎逻辑的(出于类似的原因,默认情况下在 IB 中创建的所有引用都是弱引用):

class MyClass: NSObject {
    private weak var viewController: UIViewController

    init(vc: UIViewController) {
       self.viewController = vc
       super.init
    }

    func setViewController(_ vc: UIViewController) {
       self.viewController = vc
    }

    ...
}

但是,此代码会出现编译错误,因为 viewController 变量不是可选的。所以我必须添加“!” viewController 声明并删除初始化器,只留下setViewController这看起来很不自然。

不允许非可选弱数据的原因是什么?


a 的定义本身就是weak变量是变量不会增加对象的引用计数,更重要的是对于你的问题,变量的值将自动设置为nil当引用的对象被释放时。

由于变量必须允许 nil 值,因此它必须是可选的。这就是为什么不允许使用非可选的弱变量。

不声明viewController隐式展开(使用!)。使其成为适当的选项(使用?).

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

为什么 Swift 不允许非可选类型的弱引用? 的相关文章

随机推荐

  • php cURL CURLOPT_VERBOSE 不显示有效负载

    虽然curl 的以下输出提供了有用的标头信息 但它不提供有效负载信息 例如 我想在提供的调试信息中看到 jason index json value 1 是否可以以详细模式内联显示有效负载 2 查看 cURL 处理的发送有效负载的最佳方式是
  • Rselenium 中的 rsDriver() 不起作用

    我已将 r 更新到最新版本 并再次安装了 Rselenium 我尝试使用 rsDriver 但端口 4567 有问题 与this https stackoverflow com questions 42316527 probem runni
  • 生成随机长数

    我知道要生成随机长数 我在 Java 中执行以下步骤 Random r new Random return r nextLong 这段代码在 C 中相当于什么 像这样 return long rand
  • 有人对从 ColdFusion 的 serializeJSON 方法到 PHP 的 json_decode 的问题有疑问吗?

    互联网对此没有任何帮助 我们使用 ColdFusion 编码数据serializeJSON并尝试使用 PHP 对其进行解码json decode 大多数时候 这工作得很好 但在某些情况下 json decode回报NULL 我们已经寻找了明
  • WPF 中现有控件的 ControlTemplate

    如何以XAML格式 可视化树 获取WPF中现有控件的ControlTemplate 这是为了帮助在现有模板的帮助下创建新的 ControlTemplate 查看风格窥探者 https github com drewnoakes style
  • Android SQLite - 命名参数

    我正在开发使用 SQLite 作为本地存储的 Android 应用程序 我需要在 sql 查询中使用参数 但我发现的所有示例都包含未命名的参数 如下所示 INSERT INTO SomeTable ColA ColB ColC VALUES
  • facebookConnectPlugin 未定义(ngCordova、Ionic 应用程序)

    我正在尝试将本机 fb 连接添加到我的离子应用程序 我在用着 离子 恩科尔多瓦 http ngcordova com docs plugins facebook http ngcordova com docs plugins faceboo
  • 跨多个标签获取选择和环绕内容

    我有一个脚本可以更改所选文本的背景颜色 但是 当跨多个元素 标签选择文本时 我遇到了问题 我得到的代码是 var text window getSelection getRangeAt 0 var colour document creat
  • 给定一个 HttpResponseMessage,如何读取请求的内容?

    Given a System Net Http HttpResponseMessage 我可以通过我的请求获得相当多的信息response RequestMessage 例如 response RequestMessage RequestU
  • Java堆溢出,强制垃圾回收

    我创建了一个包含一系列子元素的 trie 树 删除单词时 我将子项设置为空 我认为这会删除节点 删除是一个相对术语 我知道 null 不会删除子级 只是将其设置为 null 当使用大量单词时 会导致堆溢出 在 Linux 上运行 top 我
  • XPath 之后的正则表达式反对标记?

    我已经在寻找问题的解决方案一段时间了 并且在 regex101 com 上玩了一段时间 但找不到解决方案 我面临的问题是我必须为不同的输入选择一个字符串 因此我想使用正则表达式来从这些字符串中获取所需的数据 正则表达式将来自每个字符串的单独
  • IntelliJ 目标字节码恢复

    对于我目前正在处理的一个项目 IntelliJ 给了我编译错误Error java javacTask source release 8 requires target release 1 8 我进入 设置 gt 构建 执行 部署 gt 编
  • Windows Eclipse CDT 分析器

    我在 Windows 7 下使用 Eclipse CDT Juno 请问有人可以为该环境推荐一个好的分析器吗 如果没有 请告知可能合适的独立应用程序 您可以在Windows7中使用gprof MinGW端口 有关更多详细信息 请参阅此帖子
  • 如何访问 Azure 上的站点文件

    所以我叔叔让我在他的网站上更新一些东西 我发现他使用天蓝色服务 我以前从未使用过这项服务 环顾四周后 我认为这就像搜索应用程序服务一样简单 然后单击唯一正在运行的应用程序 然后在侧面板上单击开发中心 然后选择 FTP 访问 然后我使用 Fi
  • 在 HTML5 画布中绘制带有线性渐变的圆弧

    我在画布上画了一个圆弧 是否可以给它提供三种颜色的线性渐变 是的 这是可能的 Javascript中有一个方法 名为createLinearGradient它获取画布上下文作为源并应用由sx sy dx dy坐标 前两个选项定义起始坐标 后
  • 除了 12 小时后会话超时之外,Google Colab 还有其他限制吗?

    限制之一是每次会话只能持续 12 小时 GPU和TPU的使用有限制吗 是的 您只能使用 1 个 GPU 内存有限为 12GB TPU 具有 64 GB 高带宽内存 您可以在此处阅读article https medium com janni
  • 如何测量 NodeJS 中请求花费的时间

    const axios require axios axios get url then response gt console log response catch err gt console log err 我如何测量网站返回整页需要
  • 什么是 ORM,它是如何工作的,以及我应该如何使用它? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 如何检测试剂中的“Enter”按键?

    给出以下代码 input type text value text app state on change fn e if 31 keyCode e println ENTER println NOT ENTER 如何更改if条件以便可以将
  • 为什么 Swift 不允许非可选类型的弱引用?

    这并不是纯粹的好奇 有一种感觉 我可能误解了 Swift 中弱引用的一些内容 假设我从视图控制器创建一个类并将其引用传递给初始化程序 class MyClass vc self 由于情节提要和窗口已经保留对此视图控制器的引用 因此 MyCl