ios - 在 Interface Builder 中使用通用类作为自定义 View

标签 ios generics swift interface-builder xcode6

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

相关文章:

ios - 动画 becomeFirstResponder 会导致键盘以摆动效果出现,但只有一次

ios - 我在哪里在主从应用程序中实例化我的类

ios - Unresolved loginManager Facebook SDK swift3

Java:在运行时获取通用类参数

ios - 1.0 秒后 CAKeyframeAnimation 关键时间未执行

swift - 在 iOS 11 中请求使用 iPhone 麦克风的权限时应用程序崩溃

ios - 对于在 cellForItemAt 中将 isSelected 设置为 true 的单元格,为什么 UICollectionView 未将 isSelected 设置为 false?

android - 我正在尝试制作一个应用程序,它将从号码列表中一个接一个地调用电话

java - 如何在mockito的单元测试中传递函数中的任何UUID?

swift - 在 Swift 5 中的泛型方法中展开可选类型