如何在 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 中传递具有关联类型(通用协议)的协议作为参数? 的相关文章

  • Swift - 如何复制包含引用类型的数组

    我正在尝试复制数组及其值 为什么两个数组都引用同一个变量 您可以在 Playground 中尝试此操作 var view UIView view tag 1 var a UIView var b UIView a append view b
  • 将字符串拆分为数组,在 Swift 中保留定界符/分隔符

    寻找一种 优雅的 解决方案来分割字符串并将分隔符保留为数组中的项目 示例1 hello world hello world 示例2 hello world hello world thx 假设您要使用名为的分隔符分割字符串separator
  • 添加 NSCoding 作为扩展

    我想扩展一个框架类 我不想直接编辑源代码 并使其符合NSCoding 基本上 这是我所处情况的简化 Can t be edited class Car NSObject var color String Can be edited exte
  • 如何使用 Unity 动态注册通用类?

    我有一个包含很多类 300 和 BaseClass 的程序集 我想用接口注册一个泛型类 统一后 您必须在 Name如果你想解析接口的对象数组 我想要一个对象数组主视图模型自动地 有没有办法通过反射来自动执行此操作 有什么建议么 示例 伪 p
  • 更改 macOS 应用程序中打开窗口中的文档

    我正在为 macOS 编写一个基于文档的应用程序 我正在尝试编写一项功能来更改当前窗口中的活动文档 以便能够循环浏览文件夹中的下一个 上一个文档 就像使用图像浏览器应用程序一样 我应该调用什么命令来在当前窗口中打开不同的文档 文档表明 op
  • Twitter api 文本字段值被截断

    为什么文本字段值被截断以及如何获得完整的值 截至目前 我正在尝试获取如下所示的文本字段值 do if let responseObject try NSJSONSerialization JSONObjectWithData respons
  • GM 发布 Xcode 6 编译

    我刚刚下载了 Xcode 6 的 GM 版本 但无法编译并出现以下错误 Command Applications Xcode app Contents Developer Toolchains XcodeDefault xctoolchai
  • 在哪里实现 Swift 协议?

    在 Swift 中实现协议一致性时 我有两个选择 具有相同的最终结果 在类中实现协议 也就是说 在类定义的顶部声明一致性 并将实现放在类体内 或者 在扩展中实现协议 也就是说 完全在类之外编写符合协议的代码 这是一个例子 public cl
  • Java 泛型从类创建数组

    我有一个层次结构 其中正方形 三角形和圆形都从形状延伸 我有一个工作方法 public void someMethod File file new File File with squares ThirdPartyClass foo new
  • 只有根级导航目的地对于具有同质路径的导航堆栈有效

    我正在尝试整合NavigationStack在我的 SwiftUI 应用程序中 我有四个看法 CealUIApp OnBoardingView UserTypeView and RegisterView 我想从OnBoardingView
  • Swift 相当于 Objective-C FourCharCode 单引号文字(例如 'TEXT')

    我正在尝试在 Swift 中复制一些 Objective C cocoa 一切都很好 直到我遇到以下情况 Set a new type and creator unsigned long type TEXT unsigned long cr
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • 如何在 Swift 中使用indexesOfObjectsPassingTest:

    IndexOfObjectsPassingTest 的声明在 Swift 中看起来像这样 func indexesOfObjectsPassingTest predicate AnyObject Int CMutablePointer
  • UIStackView分布均匀填充

    所以 我有一个UIStackView其中包含四 4 UIViews 如果我删除其中一 1 个UIViews 其他三 3 个将填满UIStackView 我的问题 如何添加最大高度UIView这样它就不会填满整个空间UIStackView即使
  • 闭包存储属性初始化有什么好处?

    初始化类的属性时 此代码有什么区别以及优点 缺点 1 let menuBar MenuBar let mb MenuBar return mb and 2 let menuBar MenuBar 两个代码片段都声明并初始化存储的属性 htt
  • Swift 协议扩展实现另一个具有共享关联类型的协议

    考虑以下 protocol Foo typealias A func hello gt A protocol FooBar Foo func hi gt A extension FooBar func hello gt A return h
  • 无法在 Swift 中对闭包进行弱引用

    Update 我试着不弱化地写一下 好像也没有漏的情况 所以也许这个问题已经没有必要了 在 Objective C ARC 中 当你想让一个闭包能够在闭包内部使用它自己时 该块不能捕获对自身的强引用 否则它将是一个保留循环 因此您可以使闭包
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • 根据一个数组对多个数组进行排序

    如何根据数组对一堆数组进行排序createdAt 例如 2015 11 02 19 19 35 0000 将它们组合成另一种类型 字典 以便在 tableView 中使用是否有益 如果有的话如何 var comment AnyObject
  • 如何使用 RX 应用宽限时间?

    我有一个Observable

随机推荐

  • 核心数据。如何交换 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