3

我正在尝试为@IBDesignable控件生成示例数据,因此在为 IB 构建时,我正在欺骗控件使其成为自己的数据源。结果是我向协议中添加了一些方法,仅供 IB 使用,作为一个好公民,我希望删除这些方法以进行常规(非 IB 构建)。

我已将我的问题提炼为以下代码片段。我的协议如下所示:-

protocol TestProtocol {
#if TARGET_INTERFACE_BUILDER
    func myControl(control:AnyObject, colorForIndex index:UInt) -> UIColor?
    func myControl(control:AnyObject, textForIndex index:UInt) -> String?
#endif
}

这无法编译,并带有暗示方法重载错误的消息:"error: declaration conflicts with previous value"。错误消息在第二个函数声明中,并将第一个函数称为与它冲突的前一个声明。

但这些不是重载,由于命名参数,它们具有不同的签名。这是一个跨 Cocoa 的标准委托命名约定,以至于我拒绝在不理解原因的情况下重命名我的方法。

删除#if TARGET_INTERFACE_BUILDER修复问题,所以它对我来说不再是一个紧迫的问题,但我完全不知道为什么添加这个条件编译会产生如此奇怪的错误?

4

1 回答 1

0

我不确定它为什么会发生,但碰巧找到了一个合理的解决方法。
只需将两个声明分开,如下所示:

protocol TestProtocol {

#if TARGET_INTERFACE_BUILDER
    func myControl(control:AnyObject, colorForIndex index:UInt) -> UIColor?
#endif

#if TARGET_INTERFACE_BUILDER
    func myControl(control:AnyObject, textForIndex index:UInt) -> String?
#endif

}
于 2016-08-07T00:02:06.620 回答