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)
}