假設我有一個類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'擦除泛型。 –