当前位置: 首页 > backend >正文

swift-关联性/范型

一、关联性/范型的使用列子

1.1 Step 1: 定义协议 MaterialProcessor

protocol MaterialProcessor {associatedtype Inputfunc process(input: Input) async -> String
}

这个协议表示任何符合 MaterialProcessor 的类型都能 async 处理输入,返回一个代表“处理结果”的 String(比如文件名、路径、预览图 URL)。

1.2 Step 2: 定义两个处理器

struct ImageProcessor: MaterialProcessor {func process(input: String) async -> String {// 假设 input 是图片路径return "Processed image thumbnail for \(input)"}
}struct VideoProcessor: MaterialProcessor {func process(input: String) async -> String {// 假设 input 是视频路径return "Processed video thumbnail for \(input)"}
}actor MaterialThumbnailRender<Processor: MaterialProcessor> {let processor: Processorinit(processor: Processor) {self.processor = processor}func render(input: Processor.Input) async -> String {await processor.process(input: input)}
}

1.3 Step 3: 定义泛型 actor

actor MaterialThumbnailRender<Processor: MaterialProcessor> {let processor: Processorinit(processor: Processor) {self.processor = processor}func render(input: Processor.Input) async -> String {await processor.process(input: input)}
}

这个 actor 内部持有一个具体的 processor,并通过 render(input:) 方法调用其处理逻辑,是线程安全的。

1.4 Step 4: 使用泛型 actor

func testRender() async {let imageRenderer = MaterialThumbnailRender(processor: ImageProcessor())let videoRenderer = MaterialThumbnailRender(processor: VideoProcessor())let imageResult = await imageRenderer.render(input: "image.jpg")let videoResult = await videoRenderer.render(input: "video.mp4")print(imageResult) // 输出:Processed image thumbnail for image.jpgprint(videoResult) // 输出:Processed video thumbnail for video.mp4
}func testDataProcessor() async {let data = "HelloThumbnail".data(using: .utf8)!let dataRenderer = MaterialThumbnailRender(processor: DataProcessor())let result = await dataRenderer.render(input: data)print(result)
}

http://www.xdnf.cn/news/15877.html

相关文章:

  • 每日算法刷题Day50:7.20:leetcode 栈8道题,用时2h30min
  • 深度学习方法生成抓取位姿与6D姿态估计的完整实现
  • Python应用进阶DAY10--模块化编程概念(模块、包、导入)及常见系统模块总结和第三方模块管理
  • 设计模式笔记(1)简单工厂模式
  • 【图论】图的定义与一些常用术语
  • thinkphp8\guzzlehttp上传文件应用示例
  • Linux基础命令详解:从入门到精通
  • prometheus 黑盒监控和docker检测
  • git操作
  • Node.js:常用工具、GET/POST请求的写法、工具模块
  • ByteBuf 体系的设计与实现
  • `tidyverse` 长表、宽表的处理
  • 【HarmonyOS】ArkUI - 自定义组件和结构重用
  • 处理Electron Builder 创建新进程错误 spawn ENOMEM
  • Spring AI 聊天记忆
  • 28.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(二)
  • Spring Boot 配置文件解析
  • SpringBoot集成MyBatis的SQL拦截器实战
  • Java学习第六十部分——JVM
  • [硬件电路-52]:什么是模拟电路与数字电路;它们的共同点、核心差异点(原理、目标、关注点等)以及它们如何相互转化
  • LeetCode 852:山脉数组的峰顶索引解析与实现
  • STM32CubeMX的一些操作步骤的作用
  • 7-20 关于mysql
  • 网络安全隔离技术解析:从网闸到光闸的进化之路
  • 【硬件】GalaxyTabPro10.1(SM-T520)刷机/TWRP/LineageOS14/安卓7升级小白向保姆教程
  • RxSwift-事件属性
  • JVM-Java
  • LINUX(三)文件I/O、对文件打开、读、写、偏移量
  • 股票及金融笔记
  • 使用Qt6 QML/C++ 和CMake构建海康威视摄像头应用(代码开源)