gpt4 book ai didi

swift - 具有元类型的泛型数组(使用 AlamofireObjectMapper)

转载 作者:行者123 更新时间:2023-11-28 06:45:44 26 4
gpt4 key购买 nike

我怀疑我可能犯了与 Rob 在 post here 中所描述的相同的错误因为我应该以另一种方式来做这整件事,但要记住这一点:

我正在尝试以通用方式使用 AlamofireObjectMapper。它有一个协议(protocol)

public protocol Mappable

然后我有各种采用它的模型类

class Dog: Mappable
class Cat: Mappable
class Bird: Mappable

我有这个方法

func loadEntityArray<T: Mappable>(type: T.Type)

这是通用的原因是因为它调用了一个函数 load(),该函数需要一个使用此通用参数的完成 block 。 'type' 参数从未实际使用过,但如果泛型类型不在函数的参数列表中,您就不能将函数设为泛型。

func load(completion:(Response<T, NSError> -> Void))

loadEntityArray 是从另一个方法调用的

func letsgo() { loadEntityArray(Dog.self); loadEntityArray(Cat.self) }

到目前为止一切顺利,一切正常。但是我想将要加载的模型的数组传递给 letsgo(),但我不知道该怎么做。如果我将 letsgo() 更改为

func letsgo<T:Mappable>(models: [T.Type]) {
for mod in models {
loadEntityArray(mod)
}
}

然后用 1 个参数调用 letsgo()

letsgo([Dog.self])

它有效,但是只要我有一个 2 或更多的数组,我就会收到编译器错误“无法将 NSArray 类型的值转换为预期的参数类型 [_.Type]”,我现在不知道我会如何明确输入这个数组。

letsgo([Dog.self, Cat.self])

我尝试了各种排列,但似乎没有任何效果。我在这里做不可能的事情吗?在我看来,编译器在编译时有足够的信息来让它工作,所以我不确定这是语法问题还是我在这里用泛型做错了什么。

最佳答案

查看您的功能:

func letsgo<T:Mappable>(models: [T.Type])

它的模型参数应该是所有相同类型的数组。例如,仅包含 Dog Types 的数组。这就是为什么

letsgo([Dog.self])

有效但是

letsgo([Dog.self, Cat.self])

不会,因为它有多种类型。

解决方案:

直接使用 Mappable.Type :

func loadEntityArray(type: Mappable.Type) {}

func letsgo(models: [Mappable.Type]) {
for mod in models {
loadEntityArray(mod.self)
}
}

并将您的类型数组转换为可映射类型数组:

letsgo([Dog.self, Cat.self] as [Mappable.Type])

希望这能达到您的要求!

关于swift - 具有元类型的泛型数组(使用 AlamofireObjectMapper),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36501362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com