swift协议,IBOutlet属性不能有非对象types

我想在IB中联系一个自定义的快速代表。 委托是一个快速实现特定协议的对象。

protocol ThumbnailTableViewCellDelegate { func cellWasTouched(thumbnail: Bool, cell: UITableViewCell) } class ThumbnailTableViewCell: UITableViewCell { @IBOutlet var thumbnailTableViewCellDelegate: ThumbnailTableViewCellDelegate? } 

不幸的是,编译器抱怨:

 error: 'IBOutlet' property cannot have non-object type 'ThumbnailTableViewCellDelegate' @IBOutlet var thumbnailTableViewCellDelegate: ThumbnailTableViewCellDelegate? ^~~~~~~~~ 

你必须声明你的ThumbnailTableViewCellDelegate协议为@objc

 @objc protocol ThumbnailTableViewCellDelegate { func cellWasTouched(thumbnail: Bool, cell: UITableViewCell) } 

这是因为@IBOutlet将variables声明为weak ,只能用于对象。 我不知道为什么你不能说协议符合AnyObject ,也许这是一个Swift的错误。

您可以在IB中使用此解决方法连接您自己的协议。 这是Xcode的一个已知问题,所以有可能有一天会被解决。 直到那时:

  1. 将委托声明为AnyObject – @IBOutlet var delegate:AnyObject!
  2. 在Interface Builder中连接委托
  3. 将sockets的types更改为您的协议,例如@IBOutlet var delegate:MyDelegate

这对我有用。

协议types的variables可能不是一个对象,因为结构和枚举也可以符合协议。 为了确保一个协议只能通过类来符合,你可以用@class_protocol声明该协议。

不理想,但一个select是做这样的事情:

 @IBOutlet var objectType: NSObject! private var conformingObject: SomeProtocol { return objectType as SomeProtocol } 

必须确保你的objectType符合SomeProtocol或者事情会爆炸

IB需要AnyObject,而不是你特定的协议。 你想要连接的对象可能是,但不一定符合协议,协议可能有select权 – 所以:

使你的协议是这样的:

 @objc public protocol HexViewDataSource: NSObjectProtocol { @objc optional func dataAtOffset (_ hexView: HexView, offset: UInt64, length: Int)-> Data? @objc optional func dataLength (_ hexView: HexView) -> UInt64 } 

像这样在你的class级里宣布,例如:

 @IBOutlet weak open var dataSource: AnyObject? 

而当你使用它时,请检查它是否符合协议,选项是否存在 – 如下所示:

 if let dataSource = dataSource as? HexViewDataSource, let dfr = dataSource.dataAtOffset { setRowData(offset: offset, data: dfr (self, offset, bytesPerRow)) } 

IBOutlets将指示存储在笔尖(或故事板)文件中的对象的指针。 协议不是一个对象,因此你不能在一个nib文件中有一个。 使IBOutlet var的types成为您在笔尖中实际对象的types。