我有一个 UIButton 的自定义子类:
import UIKit
@IBDesignable
class MyButton: UIButton {
var array : [String]?
}
它是 IBDesignable,我已将其设置为 Storyboard中按钮之一的自定义类。我想使其通用,以便数组不必是 String 对象之一。所以,我尝试了这个:
import UIKit
@IBDesignable
class MyButton<T>: UIButton {
var array : [T]?
}
但是,我不确定如何将其设置为 IB 中的类(class)。我尝试输入 MyButton<String>
或MyButton<Int>
,但 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 运行时:尝试在 nib/storyboard 中使用带有导出/ Action 的纯 Swift 类会出现有关 ObjC 自省(introspection)的运行时错误。保持连接的导出其相应的代码声明已更改或消失会导致有关 KVC 的运行时错误。等等。)
忽略运行时问题并以稍微不同的方式表达...让我们回到 IB 需要了解的内容。请记住, Nib 加载系统是在运行时实例化 Storyboard 中的任何内容的系统。因此,即使类中采用泛型类型参数的部分不是 @IBInspectable
,nib 仍然需要知道要加载的通用类的哪些特化。因此,为了让 IB 让您使用 View 的泛型类,IB 必须有一个地方让您确定 Nib 应该使用您的类的哪种特化。事实并非如此——但这会是一个很棒的feature request .
同时,如果它对您的MyButton
仍然有帮助的话类涉及一些通用存储,也许您可以考虑拥有 MyButton
引用另一个包含通用存储的类。 (不过,它必须以这样的方式进行:在编译时不知道所述存储的类型 - 否则该其他类的类型参数将必须传播回 MyButton
。)
关于ios - 在 Interface Builder 中使用通用类作为自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388462/