2016-04-24 55 views
0

我试图让我的问题非常简单。我一整天都在努力工作,但没有运气。我有两个协议。可解码和可请求。相关类型和泛型调用错误函数的Swift协议

protocol Decodable { } 
struct D: Decodable { } 

protocol Requestable { 
    associatedtype Model 
} 

extension Requestable { 
    func returnValue() { 
     Utils.doSomething(Model) 
    } 
} 

和A类的Utils

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") 
    } 
} 

创建一个structř实现可请求并赋予类型别名模型字符串

struct R: Requestable { 
    typealias Model = String 
} 

当运行R()。的returnValue( )功能,它打印Default。如预期。

创建一个struct R2实现可请求并赋予类型别名模型d:当运行R2()。的returnValue()函数,其可解码实施

struct R2: Requestable { 
    typealias Model = D 
} 

,它打印Default。但我期待它会打印Decodable,因为型号D符合Decodable

创建一个struct R3实现可请求并赋予类型别名模型[d]其中数组的元素正在执行可解码

struct R3: Requestable { 
    typealias Model = [D] 
} 

当运行R3()。的returnValue()函数,它打印Default。但我期待它会打印Decodable Array,因为型号D符合Decodable

任何形式的帮助表示赞赏。

UPDATE

使用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> {} 

回答

1

预期的结果。您忘记根据您的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>

+0

我的坏。我还添加了一个正常的情况。而且该模型也可以[可解码]。 –

+0

感谢您的帮助。我在这里得到了同样的答复。 http://stackoverflow.com/questions/35431712/generic-method-override-not-working-in-swift。但是没有办法检查运行时间。自从这么多天以来,我一直在挣扎。 –

+0

@RahulKatariya:你,我的朋友,很幸运。因为我发明了你需要解决的问题。见面[OpaqueSwift](https://github.com/vmanot/OpaqueSwift)。 –

相关问题