在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;编译器拒绝这些行。两行都有错误:
另外第一行有错误:
这些错误似乎对我有点限制,因为我正在测试类型而不是无条件地转换为类型。
任何提示我怎么写这个?
提前致谢 - 霍华德。
答案 0 :(得分:0)
根据Apple's Swift Language Guide,
只有在协议标记为@objc属性时才能检查协议一致性。
Hashable
和AnyObject
不是@objc协议,因此您尝试执行的操作似乎不受支持。