为什么不能使用界面生成器使用UIView的一个具体的通用子类?

首先要做的事情是……这已经被表决为closures为什么你不能直接在界面生成器中使用generics。 TLDR的答案是IB使用Objective-C和Objective-C不支持generics。 无论如何,无法指定generics的“专业”(即使用什么types)。 这是理解和完整的意义。

然而,这个问题是关于为什么你不能使用generics的一个子类,它完全定义了generics的专业,所以IB不需要知道任何关于generics的知识,甚至首先使用generics。

考虑以下课程…

class MyView : UIView { } 

我们可以很容易地在Interface Builder中使用这个类,方法是拖出一个视图,然后将其类types更改为MyView 。 实例化时,按预期方式调用MyView的init-with-coder。

现在考虑这些类…

 class MyGenericView<T> : UIView { } class MyView : MyGenericView<String> { } 

在这种情况下,即使MyView基于MyGenericView<String> ,它本身基于UIView ,但不能在Interface Builder中使用此类。 但为什么? 这是一个完全合格的类,是UIView的子类,但是应用程序会警告它找不到指定的类。

值得注意的是,为了澄清我的问题,这是我的理解,这里MyView 不是一个generics。 它是一个完全定义的具体types,可以直接从它的类名实例化,最终基于NSObject(通过UIView),所以它似乎应该完全兼容Objective-C / IB,但似乎并不是这样的。 我试图理解为什么这是因为我的理解是, generics是一个编译器function,而不是一个运行时function,这意味着他们被编译到非generics对象,但我可能是错的。

所以…这是一个错误? 如果不是的话,是否有人能够清楚地知道为什么这个特定的场景不能按预期的那样工作,从技术angular度来看,我是否提到了编译器/运行时观察?