在运行时动态从协议实例化。类型引用

2023-11-30

我早些时候曾问过这个问题,所以你可以了解一些历史,这是 Airspeed Velocity 的一次很棒的尝试,但我觉得我还没有完全做到这一点,所以我将我的问题缩小到非常微小的范围细节才能真正破解。

快速程序接口

您可能会抱怨或否决该问题不完整,但事情就是这样,它基于设计模式,因此如果您不熟悉设计模式或哲学“编程是为了接口而不是为了实现”那么就不要抱怨或投反对票。

寻找能够解决这个问题的 SWIFT 高手。

一切顺利。

public protocol IAnimal {
    init()
    func speak()
}

class Test {
     func instantiateAndCallSpeak(animal:IAnimal.Type) {
         //use the animal variable to instantiate and call speak - 
         //no implementation classes are known to this method
         //simply instantiate from the IAnimal reference at run time.
         //assume the object coming in via does implement the protocol (compiler checks that)

     }
}

编辑 很棒的马丁……你破解了它。 抱歉我错过了这一部分

假设如果你有一个包含所有这些实现类的数组,你如何迭代实例化并调用speak(记住在这种情况下,测试不知道实现类Cat)

var animals:[IAnimal.Type] = [Cat.self, Dog.self, Cow.self] 

//and so many more implementation classes not known to test method

//我在操场上的尝试导致了一些问题,编译器抛出了错误 Segmentation failure 11

for animal in animals {
    let instance = animal()
    instance.speak()
}

您可以使用通用函数来实现这一点:

class Test {
    func instantiateAndCallSpeak<T: IAnimal>(animal:T.Type) {
        let theAnimal = animal()
        theAnimal.speak()
    }
}

Example:

class Cat : IAnimal {
    required init() {
    }
    func speak() {
        println("Miau"); // This is a german cat
    }
}

// ...

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

在运行时动态从协议实例化。类型引用 的相关文章

  • 使用 PDFOutline 将 TOC 添加到 Swift/Cocoa 中的 PDFDocument

    我正在开发一个小程序 将多个单页 PDF 合并到一个多页 PDF 中 我正在 Swift4 MacOS Cocoa 中工作 但我一生都无法在 Swift 中找到任何类型的示例来创建大纲 仅遍历现有的大纲 我对此非常熟悉 使用对文档的最佳猜测
  • Facebook 登录打开错误的应用程序

    我正在尝试使用 facebook 实现应用程序的登录 但每次我尝试登录时 它都建议打开错误的应用程序 我尝试了一些在这里找到的东西 但没有成功 在 Facebook 的开发者页面上我添加了一个后缀 我的 plist 如下 有谁知道发生了什么
  • 如何在 iOS swift 中集成 Google Pay?

    嗨 朋友们 我搜索过有关 iOS swift 中谷歌支付集成的信息 我没有找到任何相关的解决方案 请帮助我如何解决这个问题 如果有任何链接或示例 请提供链接并指导我 谢谢 这是关于在印度发起 Google Pay 操作的问题吗 例如 使用
  • SwiftUI 导航:如何将详细信息视图切换到不同的项目?

    我正在努力实现以下导航行为 用户可以从列表中选择一个项目 该项目会触发该项目的详细信息视图 在此详细视图上 导航栏中有一个 添加 按钮 可打开用于添加其他项目的模式表 到目前为止 一切都按预期进行 但添加项目后 我希望详细视图显示新项目 我
  • 当 tableview 滚动时 UISegment 值发生变化

    我正在使用 UISegmentControl 在表格视图中显示客观类型问题 但是 如果我在任一单元格中选择一个段 那么如果我滚动 某些段值就会发生更改 我不知道如何解决这个问题 请指导我 细胞尺寸 160px 段色调颜色 蓝色 Coding
  • Swift 客户端和根 SSL 证书身份验证

    积分得到token api of QLIK server with ssl证书 但执行任务后我收到这样的错误 完成时出现错误 代码 999 Your hostname and endpoint let hostname YOUR HOST
  • Alamofire 仅在 GET 请求上出现请求错误

    我正在努力将我的项目从 AFNetworking 转移到 Alamofire 真的很喜欢这个项目 POST 请求工作得很好 但是 我在尝试发出 GET 请求时收到此错误 这是一些示例代码 class func listCloudCrednt
  • 如何更改某些功能以兼容 iOS 10 或更低版本的 Snapchat 中的某些功能,例如相机视图控制器

    我正在制作一个视图控制器来制作像 snapchat 相机一样的相机视图控制器 我下面的代码在 iOS 11 或更高版本上完美运行 老实说 我并没有真正掌握我的代码 因为我只是按照这个像相机视图控制器这样的 snapchat 的教程进行操作
  • 如何在 Swift 4 中以编程方式将 IBAction 添加到 uibutton?

    如何以编程方式将 IBAction 添加到 uibutton button addTarget self action Selector buttonAction for touchUpInside func buttonAction se
  • 为什么 Ruby 使用 respond_to?而不是respond_to?

    我很好奇为什么 Ruby 用于检查对象是否响应方法的内省相关方法是respond to 代替responds to 我总是觉得很尴尬 但也许那是因为我已经习惯了respondsToSelector在 Objective c 中 Matz p
  • SwiftUI NavigationView 看不到图像

    我有一个代码并制作 NavigationLink 按钮 我编写文本和图像 但我的图像看不到 请帮助我 VStack Image Coachs resizable aspectRatio contentMode fill frame widt
  • CNContact 添加新的联系人问题

    我在通过以下方式添加联系人时遇到问题联系框架 我使用的是装有 iOS 12 1 2 的 iPhone 5s 设备 我添加联系人的代码如下 let saveRequest CNSaveRequest saveRequest add self
  • Swift 3 '[UIApplicationLaunchOptionsKey:任意]?'无法转换为 '[String : NSString]'

    我有一个 TVOS 应用程序已从 Swift 2 转换为 Swift 3 但出现以下错误 我不确定如何让它安静下来 UIApplicationLaunchOptionsKey 任意 无法转换为 String NSString 它出现在这段代
  • 在 Swift 中将 Int 转换为 UInt32

    我正在制作一个 Tcp 客户端 因此使用CFStreamCreatePairWithSocketToHost它期望第二个参数为 UInt32 这是我正在尝试做的事情的示例 func initNetwork IP String Port In
  • Swift 数组设置索引值不起作用

    我有一个方法 下面的内容 其中queue2只是一个 Int 我打印了很多东西 看看一切是否都正常 public func cool item Int println item println back queue2 insert item
  • iOS 内存警告

    我正在尝试使用从 Parse 数据库下载的图像填充集合视图 但我收到内存警告 然后偶尔崩溃 有谁知道其他应用程序如何设法呈现这么多图像而不崩溃 有人可以告诉我如何优化我已有的东西吗 这是所有相关代码 https gist github co
  • Python - 如何查询定义方法的类?

    我的问题有点类似于this one https stackoverflow com questions 5520580 how do you get all classes defined in a module but not impor
  • 如何在 Swift 语言中传递错误指针?

    我试图在 swift 中传递错误指针 但无法这样做 编译器抱怨 NSError 无法转换为 NSErrorPointer var error NSError NSError var results context executeFetchR
  • 下标:使用字符串枚举访问我的字典值

    我想做类似的事情 使用字符串枚举访问我的字典值 我试图重载字典的下标但没有成功 访问字典 let district address JsonKeys district 其中 JsonKeys 是 enum JsonKeys String c
  • 通用类不会将委托调用转发给具体子类

    鉴于以下情况 protocol EntityType var displayString String get extension String EntityType var displayString String return self

随机推荐

  • 如何在 Android 中将图像 URL 分享到 WhatsApp?

    我需要在我的应用程序中将图像分享到 WhatsApp 我有图片网址 为了分享到 WhatsApp 我使用以下代码 String image url http images cartradeexchange com img 800 vehic
  • 如何禁用heroku上的资产管道?

    heroku cedar 隐式预编译了我的资产 即使我已经写了 config assets enabled false 如何禁用资产功能 问题是编译 slug 时应用程序配置不可用 最近解决了这个问题http devcenter herok
  • while 循环仅在 bash 中的文件的第一行上运行[重复]

    这个问题在这里已经有答案了 我有一个 while 循环 应该迭代一个文本文件 但停在第一行 我不明白为什么 我的代码如下 while read hadoop accounts do if grep no lock no remove the
  • 调试Android振动

    各位 我的手机无缘无故震动 所以我想确定发送振动命令来振动的应用程序 Android 会记录此类事件吗 或者我可以编写一个应用程序来监控Vibrator vibrate TIMEOUT 来自另一个应用程序的调用 笔记 我有 root 访问权
  • 2D 位集存储为 1D 时的 XOR 位集

    回答当你只关心速度时如何存储二进制数据 我想写一些来做比较 所以我想用std bitset 然而 为了公平比较 我想要一个一维std bitset模拟 2D 所以不要有 bitset lt 3 gt b1 string 010 bitset
  • JAX-WS 返回空列表

    我是网络服务新手 我遇到了一些问题 在服务器端我使用 spring ws 在客户端我使用jax ws 使用 wsimport 工具 我根据我的 wsdl 生成了 java 类 一切正常 但由于某种原因 jax ws 无法正确解析数组和列表
  • 使用 Struts 2 实现 Spring Security

    我想实现 Spring Security Struts2 我在执行项目时遇到了问题 没有为与上下文路径 Project 关联的名称空间 和操作名称 j spring security check 映射的操作 因为struts xml中没有名
  • 使用 Java Mail 下载附件

    现在我已经下载了所有消息并将它们存储到 Message temp 如何获取每封邮件的附件列表 List
  • GKE:带有推送订阅者的 Pod 之间的 Pubsub 消息

    我正在使用具有多个 Pod 的 GKE 部署 并且需要在 Pod 之间发送和接收消息 我想用pubsub 推送订阅者 我发现对于推送 我需要为订阅者 Pod 配置 https 访问 为了接收推送消息 您需要一个可公开访问的 HTTPS 服务
  • 反编译器字节码和混淆器

    我们可以从java字节码完全逆向工程源代码吗 为什么 Java 中允许此功能以及 Java 反编译器对抗混淆器的成功率如何 我知道这个问题很老了 但我一直在寻找可靠的答案 直到什么也没找到 因此 在这篇文章中 我总结了我在混淆 J2EE J
  • XML 序列化对象列表

    查看 Microsoft 关于 XML 序列化的文章 https msdn microsoft com en us library 58a18dwa aspx 他们在 序列化对象数组 下给出了一个示例 如下所示 public class P
  • 使用 java asm 获取函数参数值以进行字节码检测

    我使用 asm 在每个执行的函数中插入回调函数 我如何打印争论者的价值观 我正在使用 MethodAdapter visitCode 将我的函数注入到运行的每个函数中 我想将函数参数插入到一个数组中 并将该数组发送给我的回调函数 并将参数返
  • 为什么某些 TemplateBinding 值未显示在设计器中,而其他值却显示在设计器中? [带有重现代码]

    我遇到了一个奇怪的情况 以下示例代码替换窗口的内容 使用设置器的背景颜色并提供带有两个标签的堆栈面板 一张用于背景 一张用于标题 问题是 他们在设计时
  • 使用 Node.js 通过 Raspberry Pi 3 model B 进行 GPIO

    我正在尝试使用树莓派 3 B 型让 LED 闪烁 我的机器上安装了所有必需的模块 即 npm nodejs pi gpio 修复了检测 gpio 的微小更改 代码是 var gpio require pi gpio gpio open 16
  • 从 Javascript 调用 Google Chrome 扩展

    有一个很棒的扩展名为Blipshot它获取页面屏幕截图 我需要使用页面级 JavaScript 调用扩展 而不是单击其图标 这可能吗 您不能从网页内调用扩展的任何方法 但是 可以将内容脚本注入网页 并使用sendMessage and on
  • AJAX 函数未返回变量

    随着我的框架的增长 我决定将其拆分为文件 而不是将其留在主设计文件中 但是 通过这样做 函数的返回不会返回任何值 数据不为空 如果我提醒 js 文件中的值 它们就在那里 功能 js 文件中的第一个函数 在执行之前包含 var lock ge
  • 将模板类的对象传递给另一个类的构造函数

    我有一个模板类 template lt typename T gt class A private T array public A int size Initialises array with size 现在我需要一个类 B 它接收类
  • 键盘箭头的扫描码是什么? (右、左、下、上)

    我需要扫描代码的箭头 右 左 下 上 我正在汇编器中制作软件 我需要知道键盘箭头扫描码的十六进制值 这些是 ASCII 代码页下部的箭头字符的字符代码 Up 0x18 向下 0x19 右 0x1A 左 0x1B 还有Unicode 中的箭头
  • Node.js 中的集群不起作用。只有一名工人始终在响应

    我正在 Node js 中练习集群 我有一个两核 CPU 我创建了两个worker 每个worker 运行一个简单的http 服务器 服务器响应回调将阻塞 5 秒 以便向其他工作人员发出下一个请求 为了验证工作人员是否并行工作 我在 Fir
  • 在运行时动态从协议实例化。类型引用

    我早些时候曾问过这个问题 所以你可以了解一些历史 这是 Airspeed Velocity 的一次很棒的尝试 但我觉得我还没有完全做到这一点 所以我将我的问题缩小到非常微小的范围细节才能真正破解 快速程序接口 您可能会抱怨或否决该问题不完整