为什么界面构建器不能使用UIView的具体通用子类?

时间:2016-11-28 21:19:55

标签: ios swift generics inheritance interface-builder

首先要做的事情......已经投票结束了为什么你不能直接在Interface Builder中使用Generics的复制品。 TLDR的答案是IB使用Objective-C而Objective-C不支持泛型。那个也没有办法指定一个通用的专业' (无论如何使用它)。这是理解并且完全合理的。

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

考虑以下课程......

class MyView : UIView
{
}

我们可以通过拖出视图,然后将其类类型更改为MyView,轻松地在Interface Builder中使用此类。实例化时,MyView的init-with-coder按预期调用。

现在考虑这些类......

class MyGenericView<T> : UIView
{
}

class MyView : MyGenericView<String>
{
}

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

  

值得注意的是,为了澄清我的问题,我的理解是MyView这里是Generic。它是一个完全定义的具体类型,可以直接从其类名实例化,最终基于NSObject(通过UIView),所以看起来它应该与Objective-C / IB完全兼容,但是没有&# 39;似乎是这种情况。我试图了解为什么,因为我的理解是 Generics是编译器功能,而不是运行时功能 意味着他们被编译到非通用对象,但我可能是错的。

所以......这是一个错误吗?如果没有,有人可以详细说明为什么这个特定场景没有按预期工作,从技术角度解决我提到的编译器/运行时观察?

0 个答案:

没有答案