为什么不能将IBInspectable与枚举一起使用?

我记得当我在2014年看到WWDCIBInspectableIBDesignable时 ,我的反应是:

太神奇了,现在我可以创建一个组件并在Interface Builder中查看结果并配置它,这是设计人员可以使用的一个很棒的功能。 完善! 不。

要了解IBDesignableIBInspectable ,请参阅我的另一篇文章– 什么是IBDesignable / IBInspectable? [1]。

尝试与IBInspectable一起使用枚举

如果尝试创建像下面的代码这样的枚举并将其与IBInspectable属性一起使用,您将看到它不起作用。

 枚举DateFormat:Int { 
案例短// 05/20/2016
案例Medium // 2016年5月20日
案例全// // May 20,2016 11:10 AM
}
  @IBDesignable 
类CustomLabel:UILabel {
@IBInspectable
var format:DateFormat = .Short {
didSet {
//更新标签
}
}
}

IBInspectable对类型有一些限制:

Int,CGFloat,Double,String,Bool,CGPoint,CGSize,CGRect,UIColor和UIImage

我认为IBInspectable不支持枚举,因为正如Swift编程语言所说:

“使用枚举创建枚举。像类和所有其他命名类型一样,枚举可以具有与之关联的方法。” [2]

因此,枚举不仅是一个简单的枚举,而且可以为(例如)创建更多的枚举:

 公共枚举DateFormat:Int { 
案例短// 05/20/2016
案例Medium // 2016年5月20日
案例全// // May 20,2016 11:10 AM

公共功能exampleFormat()->字符串{
var示例:String =“”
切换自我{
案例。简短:
示例=“ 2016年5月20日”
大小写
示例=“ 2016年5月20日”
大小写
示例=“ 2016年5月20日上午11:10”
}
返回示例
}
public init(){
自我=。
}
}

我的解决方案将IBInspectable与枚举一起使用

不幸的是,要解决此问题,我需要更改代码,并使用布尔值:

 公共枚举DateFormat:Int { 
案例短// 05/20/2016
案例全// // May 20,2016 11:10 AM

公共功能exampleFormat()->字符串{
var示例:String =“”
切换自我{
案例。简短:
示例=“ 2016年5月20日”
大小写
示例=“ 2016年5月20日上午11:10”
}
返回示例
}
public init(){
自我=。
}
}
  @IBDesignable 
公共类CustomLabel:UILabel {
var _format:DateFormat = DateFormat()
@IBInspectable
var fullFormat:Bool = false {
didSet {
如果self.fullFormat {
self._format = DateFormat.Full
}其他{
self._format = DateFormat.Short
}
self.setNeedsDisplay()
}
}
}

好! 使用此解决方案,我只有两种情况,没有更多的Medium 情况 ,我删除了它,因为这对用户体验来说不是问题。 我认为这比将fullFormat与其他类型(如Int或String)更好……为什么?

另一个解决方案

如果在代码中添加了一个Int类型的IBInspectable属性,那么Interface Builder的用户需要知道枚举的范围值,并且当fullFormat值超出范围时(例如),您需要设置_format值:

 公共枚举DateFormat:Int { 
案例短// 05/20/2016
案例全// // May 20,2016 11:10 AM
公共功能exampleFormat()->字符串{
var示例:String =“”
切换自我{
案例。简短:
示例=“ 2016年5月20日”
大小写
示例=“ 2016年5月20日上午11:10”
}
返回示例
}
public init(){
自我=。
}
public init(value:Int){
var结果:DateFormat = DateFormat()
切换值{
大小写DateFormat.Short.rawValue:
结果= DateFormat.Short
大小写DateFormat.Full.rawValue:
结果= DateFormat.Full
默认:
结果= DateFormat.Full
}
自我=结果
}
}

@IBDesignable
公共类CustomLabel:UILabel {
var _format:DateFormat = DateFormat()
@IBInspectable
var fullFormat:Int = DateFormat.Short.rawValue {
didSet {
self._format = DateFormat(值:self.fullFormat)
self.text =“ \(self._format.rawValue)”
setNeedsDisplay()
}
}
}

结果:

整数大小写类似于String或其他类型…

参考文献

[1] https://medium.com/@GeraldoBastos/whats-ibdesignable-ibinspectable-292829384e1#.h9x51kh63

[2] Apple Inc.“快速编程语言”。iBooks。 https://itun.es/br/jEUH0.l