Swift MetalKit中MTKMesh.newMeshes返回类型不匹配问题求助
解决MTKMesh.newMeshes赋值类型不匹配的问题
嘿,我来帮你搞定这个报错!问题出在MTKMesh.newMeshes(asset:device:)的返回值类型上,你之前跟着Metal 1的教程学习,而这个API在后续版本里有了变化,这才导致了类型不匹配的问题。
问题根源
MTKMesh.newMeshes(asset:device:)返回的不是单一的数组,而是一个元组,具体类型是:
(modelIOMeshes: [MDLMesh], metalKitMeshes: [MTKMesh])
而你把meshes声明成了[AnyObject]?,这和返回的元组类型完全不匹配,所以编译器直接抛出了错误。
解决方案
根据你的实际需求,有两种修正方式:
方式一:只获取MetalKit网格(用于Metal渲染)
如果你只需要用于Metal渲染的网格,调整变量类型并提取元组里的对应部分即可:
var metalMeshes: [MTKMesh]? //其他代码 let device = MTLDevice() // 确保这里正确获取了可用设备 let asset = MDLAsset() // 确保这里正确加载了模型资源 do{ let meshResult = try MTKMesh.newMeshes(asset: asset, device: device) metalMeshes = meshResult.metalKitMeshes } catch { print("加载网格失败:\(error.localizedDescription)") // 这里可以添加更多自定义错误处理逻辑 }
方式二:同时获取ModelIO和MetalKit网格
如果你需要对模型做ModelIO相关的处理(比如修改顶点数据、调整材质属性),可以同时保存两种网格:
var modelIOMeshes: [MDLMesh]? var metalKitMeshes: [MTKMesh]? //其他代码 let device = MTLDevice() let asset = MDLAsset() do{ let meshResult = try MTKMesh.newMeshes(asset: asset, device: device) modelIOMeshes = meshResult.modelIOMeshes metalKitMeshes = meshResult.metalKitMeshes } catch { print("加载网格失败:\(error.localizedDescription)") }
额外说明
Metal 1时期的newMeshes方法可能返回的是单一数组,但后续版本为了兼顾ModelIO和Metal的完整工作流,改成了返回包含两种网格的元组——这就是你遇到类型不匹配的核心原因。只要调整变量类型并正确解析元组,问题就能轻松解决啦!
内容的提问来源于stack exchange,提问作者Gabe Spound
相关产品推荐
相关产品推荐

