ios – 在Interface Builder中使用通用类作为自定义视图

我有一个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.)

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...