如何在作为协议类型的 Swift 通用数据结构中使用弱引用?

2024-03-26

我想在通用数据结构中使用弱引用;在里面 下面是数组的示例,但通常是任何泛型类型。我几乎可以得到它 上班 :(

我的实验开始得很顺利。以下作品:

// Array of weak references OK
struct WeakReference<T: AnyObject> {
    weak var value: T?
}
class C {
    var i: Int = 0
}
let c = C() // Strong reference to prevent collection
let weakCs = [WeakReference(value: c)] // OK
print("C: \(weakCs[0].value!.i)") // 0

我可以添加一个协议:

// Array of weak references that implements a protocol OK
protocol P: AnyObject { // Note AnyObject
    var i: Int { get }
}
class CP: P {
    var i: Int = 0
}
let cP = CP() // Strong reference to prevent collection
let weakCPs = [WeakReference(value: cP)] // OK
print("CP: \(weakCPs[0].value!.i)") // 0

但是当我想要一组对协议的弱引用时,我收到错误:

// Array of weak references of a protocol not OK
let weakPs: [WeakReference<P>] = [WeakReference(value: cP)] // Using 'P' as
a concrete type conforming to protocol 'AnyObject' is not supported
print("P: \(weakPs[0].value!.i)") // 0

我是否错过了什么?

错误消息“使用‘P’作为符合协议的具体类型 'AnyObject'不受支持”,暗示这是一个临时限制 编译器。这会被修复吗?我应该提交错误报告吗?

预先感谢您的任何建议,

——霍华德。


玩了一下我发现:

// Array of weak references of a protocol OK so long as protocol marked @objc
@objc protocol P { // Note @objc
    var i: Int { get }
}
class CP: P {
    var i: Int = 0
}
let weakPs: [WeakReference<P>] = [WeakReference(value: cP)] // Note typed as `[WeakReference<P>]`
print("P: \(weakPs[0].value!.i)") // 0

works :)

令人烦恼的是,你必须使用 @objc,因此不是一个纯粹的 Swift 解决方案,但由于我使用的是 iOS,这对我来说不是问题。

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

如何在作为协议类型的 Swift 通用数据结构中使用弱引用? 的相关文章

  • 在 SwiftUI TextEditor 中设置光标位置

    有没有办法以编程方式将光标移动到特定文本行或在 SwifUI 中选择它TextEditor 例如 如果有一个TextEditor里面写着10行 当用户按下按钮时 光标将导航到第三行 或者文本将被选择 目前使用默认的 SwiftUI 是不可能
  • 操作按钮未出现在通知 iOS 10 中

    我在我的应用程序中使用本地推送通知 在 iOS 10 中为通知添加操作按钮时 它不会出现在通知下方 通知正在显示 但通知底部缺少操作按钮 下面给出了 appdelegate 代码 import UIKit import CoreData i
  • 图表无法在 Xcode 14 上编译

    我在图书馆中面临以下错误 Type 图表数据集 不符合协议 范围可替换集合 实例方法不可用 替换Subrange with 用于满足协议的要求 范围可替换集合 将其附加到扩展 ChartDataSet RangeReplaceableCol
  • SWIFT:+[CATransaction Synchronize] 在解码 HTML 实体时在事务中调用

    我正在制作一个获取博客 JSON 内容的应用程序 博客文章的标题显示在 tableView 中 获取的标题是 HTML 编码的 所以我用这段代码解码了它们 func configureCell cell UITableViewCell at
  • 禁用将应用程序窗口置于前面。关闭另一个窗口后

    我有包含 2 个 NSWindowController 的 OSX 应用程序 我的问题可以通过以下几个步骤来描述 使用 2 个窗口启动应用程序 选择另一个应用程序的窗口 将其中一个窗口放在另一个应用程序窗口前面 第二个窗口将保留在底部 关闭
  • Java 泛型和数字类型

    我想创建一个通用方法来有效地执行此操作 class MyClass static
  • RecyclerView 适配器的 Kotlin 泛型

    我正在尝试编写一个通用的 recyclerview 适配器 我找到了几个例子 然而 仍然无法弄清楚如何实现通用适配器 我写的代码是 open abstract class BaseAdapter
  • SwiftUI TabbedView 仅显示第一个选项卡的内容

    我正在尝试建立一个TabbedView使用以下简单代码 TabbedView Text Hello world tabItemLabel Text Hello Text Foo bar tabItemLabel Text Foo 运行时 两
  • 如何在 Swift 中创建不可变数组?

    如何在 Swift 中创建不可变数组 粗略阅读文档会建议你可以这样做 let myArray 1 2 3 但遗憾的是 这实际上产生了一个可变的 固定大小的数组 这种可变性会产生常见的谜题 比如意外的别名和函数参数的突变 let outter
  • Swift callkit 有时无法在接听电话后激活扬声器(仅限来电)

    在关注 Marco评论后 我更新了如下代码 但仍然无法正常工作 扬声器有时无法启用 在报告新呼叫 用户接受的呼叫之前 我调用了以下 2 种方法 configureAudioSessionToDefaultSpeaker func confi
  • 如何将计算值转换为文字以进行枚举初始化

    我遇到了枚举的问题 因为我想将 case 初始化为双精度值PI 180 有没有办法通过常量或一些时髦的魔法获取这个计算值并将其转换为文字 以便我可以初始化枚举 我宁愿不必做3 14 我宁愿使用该值的实际编译器和硬件计算表示 所以我的第一次尝
  • 将本机 swift Set 转换为数组[重复]

    这个问题在这里已经有答案了 我需要将 Set 转换为 AnyObject 或 String 的数组 这可能吗 我知道使用 NSSet 我可以使用 allObjects 但对于本机集似乎没有任何函数 只需直接强制转换为数组即可 let arr
  • 在 Swift 中使用 Obj-C 完成块

    在 Objective C 中 我有一个完成块类定义为 File h typedef void MYCompletionBlock BOOL success NSDictionary result NSError error 然后 在 Sw
  • 将对象映射到 TableView 部分的 Swift 二维数组

    我想不出更好的方法来做到这一点 我将学生对象的所有属性映射到二维数组中 所以我的电视有几个部分 我也不能使用静态表视图 如果是这样 这个问题就不会存在 所以我在 TVC 中的代码 let currentUser PFUser current
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 数组扩展以按值删除对象

    extension Array func removeObject
  • 使用 AVFoundation 和 Swift 访问多个音频硬件输出/通道

    如何使用 AVFoundation 访问除 1 2 之外的其他音频硬件输出 我正在为 Mac OS X 应用程序编写快速代码 该应用程序通过各种输出设备 USB 接口 dante soundflower 播放 mp3 文件 如下所示 myP
  • CollectionBase 与泛型

    我正在将应用程序从 NET 1 1 迁移到 NET 2 0 我应该删除 CollectionBase 的所有使用吗 如果是这样 最好的迁移策略是什么 是的 最好看的类是 System Collections Generic 我通常使用列表
  • swift:移动动画

    我在故事板中有 viewController 还有4个正方形 我想将我的方块放在视图中 首先我想显示两个正方形 如果我按下按钮 我希望我的红色 2 个方块向左移动 然后显示接下来的 2 个蓝色方块 就像这部动画 我需要创建一个scrollV
  • iOS 13 UIActivityViewController 在图像保存后自动呈现以前的 VC

    我正在尝试实现 将图像保存到库 功能 然后返回到当前视图控制器 但在新的 iOS 13 上 它会返回到呈现当前视图控制器的视图控制器 PHPhotoLibrary requestAuthorization status PHAuthoriz

随机推荐

  • 嵌入时间线中的多个推特提要

    我现在正在开发一个网站 其中会有多个公司简介 每个个人资料都需要有一个 Twitter feed 并且在每个 feed 中我需要能够包含至少 2 个 Twitter 用户的推文 正在分析的公司和网站的 feed 本身 可能还有第三个 我有点
  • 提示用户输入密码 - Google OpenID Connect

    我们正在尝试将 Google 的 OpenID Connect 用于商业网络应用程序 但担心用户会使应用程序保持打开状态 并且未经授权的用户将登录 因为用户仍然登录到 Google 因此 OpenID Connect 只是让他们直接登录 W
  • 如何从多个线程同时访问MySQL

    我们正在对 MySQL 进行一个小型基准测试 希望了解它对我们的数据的执行情况 该测试的一部分是看看当多个并发线程用各种查询攻击服务器时它是如何工作的 The MySQL 文档 http dev mysql com doc refman 5
  • 如何使用rest api将数据集作为csv文件导入到power bi?

    我想在 power bi 中自动执行导入过程 但我找不到如何将 csv 文件发布为数据集 我正在为此使用 C 解决方案 有没有办法做到这一点 您无法将 CSV 文件直接导入到 Power BI 服务中已发布的数据集 AddRowsAPIEn
  • 如果时区设置为“UTC”,SimpleDateFormat 会忽略“XXX”

    我正在尝试按以下格式将当前日期时间输出为 UTC 2016 01 11T14 08 42 00 00 final SimpleDateFormat formatter new SimpleDateFormat yyyy MM dd T HH
  • PHP 的项目结构

    我是 PHP 新手 想了解 php 项目的目录结构 我有Java方面的经验 在java中我们有src包含java源文件 WEB INF包含lib和jsp页面 PHP 中有类似的标准目录结构吗 我们在 php 中也有分层吗 就像我们在 jav
  • Python 现在或将来会弃用“pytz”吗?

    pytz https pytz sourceforge net 用于Django 版本 选择当前时区 https docs djangoproject com en 3 2 topics i18n timezones selecting t
  • MYSQL 使用空间索引

    我正在尝试利用空间索引 我有一个 ip 表和一个包含 ip 块范围的 ip2geo 表 我正在尝试将 Geo ID 分配给 ip2geo 表中的每个 ip 当尝试使用列值进行选择时 空间索引不会被使用 EXPLAIN SELECT SELE
  • 为什么通过 AJAX 发送此 POST 变量为 Null? (jquery/php)

    该 JavaScript 用于 加载更多 功能 当单击按钮 moreg 时 它会从 load php 中获取固定数量的元素 function moreg click load var countg 1 load function load
  • 为什么我的 Nginx 反向代理执行 301 重定向而不是代理?

    我在 docker 容器内有一个 Nginx 反向代理 它监听端口 3000 并暴露给 3002 docker run p 3002 3000 这个想法是这个反向代理将代理 my app到我的笔记本电脑中在端口 8080 上运行的实例 和
  • 以编程方式更改视图的右边距?

    这个属性可以在Java代码中动态改变吗 android layout marginRight 我有一个TextView 它必须动态地将其位置向左更改一些像素 如何以编程方式做到这一点 编辑 一种更通用的方法 不依赖于布局类型 除了它是支持边
  • 如何在 IndexedDB 中进行 JOIN 类型查询

    我尝试按照以下教程进行操作http hacks mozilla org 2010 06 comparing indexeddb and webdatabase http hacks mozilla org 2010 06 comparing
  • 如何在 jquery 表单验证上显示独特的成功消息

    希望你能在这方面帮助我 我目前正在使用这个 jQuery 插件 验证 主页 http bassistance de jquery plugins jquery plugin validation 我一直在这里阅读相关问题 但这是最接近的 h
  • 我可以用什么来替换 HTML 中的   ?

    nbsp nbsp 我觉得很丑 边距和 或填充 CSS 属性 如下所示 p style padding left 10px Hello p 值得注意的是 放置这样的内联样式通常被认为是不好的做法 您通常在外部 css 文件中声明一个选择器并
  • 服务器场(服务计划)SKU

    是否有文档列出了 Azure 应用服务计划 服务器场 支持的 sku 名称和层 例如 名称 S1 等级 标准 S1 标准 和 名称 Y1 层 动态 功能消耗计划 支持的值列表 是否有第二年的消费计划 和服务器配置确实有助于规划 有多种方法可
  • Rails 4 中“确认”条件的干净方法

    我的 Rails4 页面上有一个使用 slim 语法的 link to 以下链接 to link to exports path data confirm Are you sure 现在需要仅在特定条件下显示确认消息 我们如何在rails4
  • 如何删除数据框中值的顺序不重要的行

    我有一个像这样的数据框 source target weight 1 2 5 2 1 5 1 2 5 1 2 7 3 1 6 1 1 6 1 3 6 我的目标是删除重复的行 但源列和目标列的顺序并不重要 事实上 两列的顺序并不重要 应该将其
  • 使用 Linq to SQL 删除表中的行

    我有一个体育数据库 其中有一个表 groupmembers 其中包含字段 ID groupID 和 memberID 我从名为 txtRemoveGroupMember 的文本框中获取memberID 并从复选框列表中获取groupID 现
  • 使用 Boost Spirit 解析语法

    我正在尝试解析像下面这样的树表达式之类的 C 函数 使用精神解析器框架 http en wikipedia org wiki Spirit Parser Framework F A B GREAT SOME NOT C YES 为此 我尝试
  • 如何在作为协议类型的 Swift 通用数据结构中使用弱引用?

    我想在通用数据结构中使用弱引用 在里面 下面是数组的示例 但通常是任何泛型类型 我几乎可以得到它 上班 我的实验开始得很顺利 以下作品 Array of weak references OK struct WeakReference