I am trying to create a protocol for JSON loading delegation, JSONLoaderDelegate
. My other class, called JSONLoader
, is supposed to dispatch events to its delegate (that implements the JSONLoaderDelegate
protocol) like:
self?.delegate?.jsonLoaderdidEndWithError(self!, error: JSONLoaderError.LoadError)
The implementation of the JSONLoader is not that important (imho). However I seem to have problems to implement the protocol, this is the code:
@objc protocol JSONLoaderDelegate {
optional func jsonLoaderdidBeginLoading(jsonLoader: JSONLoader)
func jsonLoaderdidEndWithError(jsonLoader: JSONLoader, error: JSONLoader.JSONLoaderError)
func jsonLoaderDidEndWithSuccess(jsonLoader: JSONLoader)
}
This looks pretty straightforward to me but I am getting an error:
method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C.
pointed to all three functions.
Obviously, if I remove the @objc
attribute I cannot use the optional
for the function. I would really like to keep jsonLoaderdidBeginLoading
as optional tho. Any ideas / ways to solve this? Thank you!
What the 3 methods have in common is the
JSONLoader
parameter, and that's what I think prevents you from bridging the protocol. In order to solve the problem you have to make it objc compatible.I had the same error.
method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C.
I changed the syntax to the following in swift 2.0. It works fine now!
Note: the Competitor class type changed to NSObject which cleared the delegate rule violation
Also in the case of NSJSON parsing. I changed to the following.
Is this an enum type? You cannot convert Swift enums to Obj-C code. You'll need to use an int instead.
I faced this problem as I had a class
MyConnection
that had no parent class. Like this.I can't put
@objc
before this, as I get a warningSo I changed the class to be inherited from
NSObject
. Like this