具有关联类型和泛型调用错误函数的 Swift 协议



我试图让我的问题非常简单。我一直在努力让它工作一整天,但没有运气。我有两个协议。可解码和可请求。

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>

最新更新