【发布时间】:2016-12-26 23:55:54
【问题描述】:
我想检查泛型类型是否符合协议。如果是,我需要转换类型本身并针对它调用静态方法。
func log<T>(object: T) {
if let C = T as? Loggable { // this line doesn't compile
print("\(C.description(of: object))")
} else {
print("\(object)")
}
}
有人知道这是否可行吗?
更新
我的第一个代码 sn-p 让您感到困惑。希望第二个更有意义。感谢@portella 的回答,我做了一些更改,但这还不够。
func decodeObject<T>() -> T? {
guard let object = objects.first else {
return nil
}
objects.removeFirst()
if object is NSNull {
return nil
}
if T.self is Coding.Type { // the condition is fixed, thanks to @Hiron
if let data = object as? Data {
return type(of: (T.self as! Coding)).from(data: data) as? T
} else {
return nil
}
}
return object as? T
}
【问题讨论】:
-
为什么不只重载两个
log?一个用于LoggableT,一个用于任何T。 -
@Hamish 这可能是一个选项。如果找不到答案,我会以这种方式实施。谢谢
-
我认为this answer 应该对你想要做的事情有用。