我有一个UIButton的自定义子类:
import UIKit @IBDesignable class MyButton: UIButton { var array : [String]? }
它是IBDesignable,我已经将其设置为我的故事板中的其中一个按钮的自定义类.我想使它成为通用的,因此数组不一定是String对象之一.所以,我试过这个:
import UIKit @IBDesignable class MyButton<T>: UIButton { var array : [T]? }
不过,我不确定如何将此设置为IB中的班级.我试着把MyButton< String>或MyButton∬但是Interface Builder只是删除尖括号部分并获得以下编译错误:
Command /Applications/Xcode6-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift Failed with exit code 254
解决方法
Interface Builder通过ObjC运行时“与您的代码通讯”.因此,IB只能访问在ObjC运行时可以表示的代码的特征. ObjC不做泛型,所以没有办法让IB告诉运行时你使用泛型类的专业化. (和Swift通用类不能实例化没有专门化,所以你收到一个错误尝试实例化MyButton而不是MyButton< WhateverConcreteType>).
(当您打破其他事情时,您可以在IB工作中识别ObjC运行时:尝试在笔尖/故事板中使用具有插座/动作的纯Swift类,提供有关ObjC内省的运行时错误.保留相应代码声明已更改的插座或离开给出关于KVC的运行时错误.等等)
忽略运行时问题,并以略有不同的方式让我们回到IB需要知道的内容.记住,笔尖加载系统是在运行时实例化故事板中的任何东西.所以即使你的类的部分采用通用类型参数也不是@IBInspectable,所以笔尖仍然需要知道你的泛型类的特殊化要加载.所以,对于IB,让你使用泛型类进行查看,IB必须有一个地方可以确定你的班级应该使用哪个专业化的地方.它不 – 但这会使一个伟大的feature request.
在此期间,如果您的MyButton类仍然有助于涉及一些通用存储,那么也许您可以查看MyButton引用另一个包含通用存储的类. (它必须这样做,尽管在编译时不知道所述存储的类型 – 否则该另一个类的类型参数必须传播回MyButton.)