一、关联性/范型的使用列子
1.1 Step 1: 定义协议 MaterialProcessor
protocol MaterialProcessor {
associatedtype Input
func 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: Processor
init(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: Processor
init(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.jpg
print(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)
}