如何动态测试自我类型和不相关的类型

时间:2014-11-04 00:06:49

标签: reflection swift

在Swift中我可以写:

func id(_: Any) -> Int? {
    return nil
}
func id<T: Hashable>(hashable: T) -> Int? { // Weird, what's T needed for? Why not "func id(hashable: Hashable) -> Int? {"?
    return hashable.hashValue
}
func id(object: AnyObject) -> Int? {
    return reflect(object).objectIdentifier?.hashValue
}

但是,上面根据参数的静态(声明)类型选择要调用的id函数。我真的想要使用实际运行时类型的动态版本,即我真的想要:

func dynamicId(anything: Any) -> Int? {
    switch anything {
    case let hashable as Hashable:
        return hashable.hashValue
    case let object as AnyObject:
        return reflect(object).objectIdentifier?.hashValue
    }
    return nil
}

问题在于这两个案例让......作为......:&#39;编译器拒绝这些行。两行都有错误:

  • 来自&#39; Any&#39;不相关的类型......

另外第一行有错误:

  • 协议&#39; Hashable&#39;只能用作通用约束,因为它具有Self或关联类型要求

这些错误似乎对我有点限制,因为我正在测试类型而不是无条件地转换为类型。

任何提示我怎么写这个?

提前致谢 - 霍华德。

1 个答案:

答案 0 :(得分:0)

根据Apple's Swift Language Guide

  

只有在协议标记为@objc属性时才能检查协议一致性。

HashableAnyObject不是@objc协议,因此您尝试执行的操作似乎不受支持。