如何用ModelMapper实现任意Mappable类型的数组序列化?
解决ModelMapper中映射任意Mappable类型的类型不匹配问题
我明白你遇到的这个类型困惑——这其实是Swift中元类型嵌套的常见坑。咱们先拆解问题,再给你可行的解决方案:
问题根源
你写的[type].self本质上是“一个包含Mappable.Type元素的数组类型”,也就是[Mappable.Type],但ModelMapper的map(to:)方法需要的是“元素类型为Mappable的数组类型”,也就是[Mappable].Type。这俩完全不是一回事,Swift编译器自然会报错。
解决方案:用元类型的构造器转成正确的数组类型
我们需要把传入的Mappable.Type转换成对应的数组类型[Mappable].Type,可以通过Swift的元类型特性来实现。这里有两种常见写法:
写法一:直接构造目标数组类型
修改你的函数,把[type].self替换成Array<type>.self,这样就能得到正确的[Mappable].Type类型:
func serializeData<T: Mappable>(of type: T.Type) -> [T]? { return try? response?.map(to: Array<T>.self) }
或者更简洁的等价写法:
func serializeData<T: Mappable>(of type: T.Type) -> [T]? { return try? response?.map(to: [T].self) }
写法二:利用泛型自动推导(更优雅)
其实你完全可以不用手动传type参数,让Swift通过泛型自动推导类型,代码会更简洁直观:
func serializeData<T: Mappable>() -> [T]? { return try? response?.map(to: [T].self) } // 调用示例:直接指定泛型类型即可 let userList = serializeData<User>() let postList = serializeData<Post>()
为什么这样可行?
当你用[T].self(或者Array<T>.self)时,T是具体的Mappable子类(比如User、Post),所以[T].self对应的就是[User].Type或[Post].Type,刚好匹配ModelMappermap(to:)方法要求的[Mappable].Type(因为User和Post都遵循Mappable协议)。
这样修改后,你的函数就能正确映射任意Mappable类型的数组了。
内容的提问来源于stack exchange,提问作者Igor Andreev
相关产品推荐
相关产品推荐

