我试图让我的问题非常简单。我一直在努力让它工作一整天,但没有运气。我有两个协议。可解码和可请求。
protocol Decodable { }
struct D: Decodable { }
protocol Requestable {
associatedtype Model
}
extension Requestable {
func returnValue() {
Utils.doSomething(Model)
}
}
和一类 实用工具
class Utils {
static func doSomething<T>(param: T) {
print("Default")
}
static func doSomething<T: Decodable>(param: T) {
print("Decodable")
}
static func doSomething<T: Decodable>(param: [T]) {
print("Decodable Array")
}
}
我创建一个实现可请求的结构 R 并将类型别名模型提供给字符串
struct R: Requestable {
typealias Model = String
}
当我运行 R().returnValue() 函数时,它会打印Default
.不出所料。
我创建了一个实现可请求的结构 R2,并将类型别名 Model 交给实现可解码的 D
struct R2: Requestable {
typealias Model = D
}
当我运行 R2().returnValue() 函数时,它会打印Default
. 但我预计它会打印Decodable
,因为模型D
符合Decodable
。
我创建一个实现可请求的结构 R3,并将类型别名 Model 交给 [D],其中数组的元素正在实现可解码
struct R3: Requestable {
typealias Model = [D]
}
当我运行 R3().returnValue() 函数时,它会打印Default
. 但我期待它会打印Decodable Array
,因为模型D
符合Decodable
。
任何帮助都表示赞赏。
更新
在这种情况下,使用 AnyRequestable 并签入运行时将不起作用,因为在实际代码中,泛型是返回值,无法动态检查。
在实际代码函数中,签名类似于
public static func ResponseSerializer<M>() -> ResponseSerializer<M, NSError> {}
public static func ResponseSerializer<M: Decodable>() -> ResponseSerializer<M, NSError> {}
public static func ResponseSerializer<M: Decodable>() -> ResponseSerializer<[M], NSError> {}
这是预期的结果。您忘记声明Model
关联类型的Decodable
一致性。这应该可以解决它:
protocol Requestable {
associatedtype Model: Decodable
}
编辑:阅读您的评论,我现在了解您的问题。问题是,你所要求的需要运行时,没有办法静态地实现它:
class Utils {
static func doSomething<T>(param: T) {
if let param = param as? Decodable {
print("Decodable")
} else {
print("Default")
}
}
}
想一想;当你编译代码时,在returnValue
范围内,编译器只知道Model
是一个关联的类型,没有别的。要么显式声明一致性Decodable
,要么编译器假定默认情况,即 <T>
。