Search code examples
iosinterface-builderswift

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?
    ^~~~~~~~~

Solution

  • 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.