如何在 Swift 中传递具有关联类型(通用协议)的协议作为参数?

2023-12-25

我必须将接口作为参数传递给函数。接口是通用的,也称为具有关联的类型。我找不到一个好的方法来做到这一点。这是我的代码:

protocol IObserver : class {
    typealias DelegateT
    ...
}

class Observer: IObserver {
    typealias DelegateT = IGeneralEventsDelegate // IGeneralEventsDelegate is a protocol
    ...
}

func notify(observer: IObserver) { ... } // here I need a type for observer param

我发现这会起作用:

func notify<T: IObserver where T.DelegateT == IGeneralEventsDelegate>(observer: T) { ... }

,但是拜托,这太复杂了。如果我想将此参数保存在类变量中,我应该使整个类通用吗?仅仅因为这个函数。

确实,我是 C++ 开发人员,而且我是 Swift 语言的新手,但完成事情的方式太复杂且用户不友好......或者我太愚蠢了:)


如果你使用typealias在协议中使其类似于泛型,那么在解析关联类型之前,您不能将其用作变量类型。正如您可能经历过的那样,使用具有关联类型的协议来定义变量(或函数参数)会导致编译错误:

协议“MyProtocol”只能用作通用约束,因为它具有与 Self os 相关的类型要求

这意味着您不能将其用作具体类型。

因此,我知道使用具有关联类型的协议作为具体类型的唯一两种方法是:

  • 间接地,通过创建一个实现它的类。可能不是你计划做的
  • 像您在 func 中所做的那样显式关联类型

另请参阅相关答案https://stackoverflow.com/a/26271483/148357 https://stackoverflow.com/a/26271483/148357

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

如何在 Swift 中传递具有关联类型(通用协议)的协议作为参数? 的相关文章

随机推荐

  • 核心数据。如何交换 NSPersistentStores 并通知 NSFetchedResultsController?

    我正在实施用户的备份和恢复 通过 Dropbox Core Data持久化数据 为了进行恢复 我从 Dropbox 中提取文件并将它们临时存储在 Documents 目录中 然后我创建一个新的NSPersistentContainer并在删
  • 删除 HTML 元素的工具提示延迟 [重复]

    这个问题在这里已经有答案了 Mukyuu 有用地标记了一个重复的问题 但它已经很老了 2019 年的正确答案可能会非常不同 例如 Andy Hoffman 提出了一种几年前不可行的解决方法 这个问题 https stackoverflow
  • 使用 sed,删除字符第一次出现之前的所有内容

    假设我有一条像这样的线 Hello my first name is Bart and my second is Homer 如果我想在第一次之后得到所有东西我该怎么办 or using sed 在这个例子中 我想得到结果 Bart and
  • 如何在 Visual Studio 中定义即时自动更正宏?

    通过即时自动更正宏 我的意思是我所做的常见拼写错误列表以及用什么来替换它们 例如 每次我尝试输入 图层 时 都会显示 LAyer 我没有使用任何名为 LAyer 的东西 所以我希望它在我输入后自动用 Layer 替换 LAyer 的每个实例
  • 在一个函数中处理 React.KeyboardEvent 或 React.MouseEvent

    我正在尝试获取一个函数来处理单击和键盘事件 因为我正在尝试使我的网络应用程序键盘可访问 当我使用 类型的符号我收到错误 Property key does not exist on type KeyboardEvent
  • AWS CodeBuild 无法与 RDS 实例交互

    我在 AWS 中有最基本的设置 一个可公开访问的 RDS 实例 PostgreSQL 9 6 6 与我的开发实例相同 CodeBuild 项目 均位于默认 VPC 中 我的应用程序是用 Laravel 5 5 编写的buildspec ym
  • Scala 中所有函数的超类型是什么?

    我知道我能做到instanceOf检查Function1 or Function2等等 但是有没有一种通用的方法来查看某些东西是否功能正常 它可以有任意数量的参数 我尝试定义这样的东西 type FuncType Any gt Any 但这
  • 在 Javascript 中,如何转换字符串以便可以使用它来调用属性?

    所以 我有一个关联数组 数组中的键是对象的属性 我想循环遍历数组 并在每次交互中执行如下操作 Object key 然而 这不起作用并导致返回未定义而不是属性的值 有没有办法做到这一点 您可以使用 for in 循环 for var key
  • 使用 RxJava 处理分页

    我在 Android 应用程序上使用 Retrofit RxJava 并询问自己如何处理 API 分页以链接调用 直到检索到所有数据 是这样的吗 Observable
  • Xcode 中是否支持 git rebasing?

    Can one rebase在 Xcode 中将一个分支的更改集成到另一个分支 我知道 Xcode 支持合并 但我找不到任何用于变基的东西 它没有 因为它试图提供对正在使用的版本控制系统的抽象 如果想要 git 的 Mac GUI 你可以使
  • Android ViewFlipper + 手势检测器

    我正在使用手势检测器来捕获 flings 并在发生这种情况时使用视图翻转器来更改屏幕 我的一些子视图包含列表视图 如果您在列表视图上滑动 手势检测器将无法识别滑动 但如果它位于 TextView 或 ImageView 的顶部 它会识别它
  • 目标文件中的符号表和重定位表

    据我了解 目标文件中的指令和数据都有地址 第一个数据项从地址 0 开始 第一条指令也从地址 0 开始 重定位表包含有关在文件中的地址发生变化时需要更新的指令的信息 例如 如果文件与另一个文件链接在一起 在下面的示例中 A 行将位于重定位表中
  • 如何将文本字符串发送到服务?

    我有一个桌面应用程序和一项服务 如何将字符串从桌面应用程序发送到我的服务并在服务中处理它 我不想使用套接字 因为它可能被 Windows 防火墙阻止 如果您不想使用网络传输 那么执行跨会话 IPC 的最简单方法可能是使用命名管道 需要注意的
  • 有没有一个工具可以自动将make文件转换为sln/vcproj?

    Google 展示了许多用于获取 Visual Studio 格式 sln vcproj 文件并从中生成 make 文件的工具 但我找不到解决相反问题的文件 我有一个引用数百个 c 和 h 文件的 make 文件 并且 为了方便 调试 在
  • Ruby on Rails - 在特定日期时间自动触发事件

    我想触发一个事件 特别是在特定日期时间 这是我的模型之一中的一列 发送一封电子邮件并更新某些模型的属性 我已经四处搜寻 但还没有真正找到任何解决方案 有什么办法可以实现这一点吗 您可以将排队解决方案与调度程序一起使用 排队解决方案 Resq
  • 用 NA 填充时间序列中缺失的月份[重复]

    这个问题在这里已经有答案了 我有数据集 年月数字 2002 01 2 392909 2002 02 2 496800 2002 03 2 341897 2002 04 1 665625 2002 05 2 398261 2003 01 1
  • Chrome 扩展:异步查询选项卡

    我有两个变量被设置为函数的 返回值 这些函数是获取选项卡的 URL 和对实际选项卡对象的引用 并将它们存储在变量中 我有一些代码 function init var url getUrl var tab getTab function ge
  • 提取标签之间的字母

    谁能指导我如何提取标签之间的单词 例如 hello in C 我猜他是想在之间说一句话tags 您应该使用正则表达式来实现相同的目的
  • c#:如何确定可滚动控件的 ScrollBar 当前是否显示?

    有没有办法让我检查控件的滚动条当前是否显示 我想使用它 这样我就可以确定如何调整 Scrollable 控件的子级的大小 这在某种程度上取决于 ScrollBar 是否显示 Scrollable 控件可以动态调整大小 对于具有 AutoSc
  • 如何在 Swift 中传递具有关联类型(通用协议)的协议作为参数?

    我必须将接口作为参数传递给函数 接口是通用的 也称为具有关联的类型 我找不到一个好的方法来做到这一点 这是我的代码 protocol IObserver class typealias DelegateT class Observer IO