假设我有一个类class C<T>
。如何测试一个对象是继承的还是泛型类的成员?
我想要写的函数f(_ a: Any) -> Bool
,当a
是类从C
继承的成员(或为C
本身),其返回true。我不在乎专业化:通过C<Int>
,C<Double>
,C<Whatever>
都应该返回true
。
它似乎像我应该能够只写a is C
或a as? C != nil
作为函数体,但是,这些都没有在操场编译; swiftc抱怨说:“通用参数'T'不能推断为'C < _>'”。如果我在C
内写作f
作为实例方法,C
隐含地为C<T>
,所以编写let c = C<Int>(); c.f(C<Double>())
返回false
。
我可以通过编写一个协议P
,其中C
符合,然后测试,但我不认为这是一个很好的解决方案;这只是一个黑客。
有没有办法做到这一点?
这里的一切我写尝试这种代码:
class C<T> {
func test(_ a: Any) -> (Bool, Bool) {
return (type(of: a) == C.self, a is C)
}
}
class D: C<Double> { }
let d = D()
func f(_ a: Any) -> Bool {
return a is C // generic parameter 'T' could not be inferred in cast to 'C<_>'
}
d.test(C<Int>()) // false, false
// bad solution
protocol P { }
extension C: P { }
d is P // true
关于实用性的观点;仅仅因为我不知道'someObject'专用的类型并不意味着它从'C'继承的知识是无用的;例如,只知道某个对象(例如,在视图层次结构中的超级视图)属于'C'类型,可能意味着某些对象下面的视图的不变量可以保持不变。 –
@BenPious如果你在一个视图层次结构中,只需使用'标签'。通过检查一个superview的标签是否有价值,你可以知道这是否是你正在寻找的视图。它们不够吗? – Sweeper
任何人都可以选择与我为某些视图所做的相同的标记。此外,现在'C'的用户必须知道他们不能设置从'C'继承的类型实例的标签,否则会破坏'C'的实现细节。要清楚,作为'C'的成员足以知道不变量存在;这不是一些具体的事例。所以我想要测试一下;而且如我在问题结尾处所说的那样,似乎我不能用'C'(并且只有'C')符合'P'擦除泛型。 –