Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

swift protocol, IBOutlet property cannot have non-object type

I would like to wire up a custom swift delegate in IB. The delegate is an object that implements a certain protocol in swift.

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

class ThumbnailTableViewCell: UITableViewCell {
    @IBOutlet var thumbnailTableViewCellDelegate: ThumbnailTableViewCellDelegate?
}

unfortunately, the compiler complains with:

error: 'IBOutlet' property cannot have non-object type 'ThumbnailTableViewCellDelegate'
    @IBOutlet var thumbnailTableViewCellDelegate: ThumbnailTableViewCellDelegate?
    ^~~~~~~~~
like image 316
Rene Limberger Avatar asked Jul 03 '14 19:07

Rene Limberger


2 Answers

You have to declare your ThumbnailTableViewCellDelegate protocol as @objc:

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

This is because @IBOutlet declares the variable as weak, which only works with objects. I'm not sure why you can't just say the protocol conforms to AnyObject, perhaps that's a Swift bug.

like image 135
Nate Cook Avatar answered Sep 23 '22 11:09

Nate Cook


You can in connect your own protocols in IB with this workaround. It's a known issue with Xcode, so will probably be solved one day. Until then:

  1. Declare the delegate as an AnyObject - @IBOutlet var delegate:AnyObject!
  2. Connect the delegate in Interface Builder
  3. Change the outlet's type to your protocol, e.g. @IBOutlet var delegate:MyDelegate

This works for me.

like image 42
Morten J Avatar answered Sep 22 '22 11:09

Morten J