I have been following this tutorial to learn swift & iOS app development. In the Protocol section, the tutorial defined the following protocol:
@objc protoco
From what I can tell, marking your protocol as @objc means that any classes implementing it also have to be exposed to Objective-C. This can be done either by making Vicki a subclass of NSObject:
class Vicki: NSObject, Speaker {
Or by marking each implemented method as @objc:
class Vicki: Speaker {
@objc func Speak() {
print("Hello, I am Vicki!")
}
@objc func TellJoke() {
print("Q: What did Sushi A say to Sushi B?")
}
}
Update: From Apple's Swift Language Documentation
Optional protocol requirements can only be specified if your protocol is marked with the @objc attribute.
...
Note also that @objc protocols can be adopted only by classes, and not by structures or enumerations. If you mark your protocol as @objc in order to specify optional requirements, you will only be able to apply that protocol to class types.
Add an extension to the protocol returning empty functions and default values. Any class that conforms to the protocol and wishes to override any func or var may optionally do so.
public protocol Speaker {
func Speak()
func TellJoke()
}
extension Speaker {
func Speak() {}
func TellJoke() { print("What did the Teabag say to the Octopus?"}
}
The bonuses are you don't inherit all of the obj-c baggage.
Looks like we only need to prefix protocol method with @objc
in private class.
private class A: NSObject, SomeObjcProtocol {
@objc func someProtocolMethod() {}
}
Warning is not likely to rise for non-private class.
class A: NSObject, SomeObjcProtocol {
func someProtocolMethod() {}
}
Both are fine.
In order for a type to conform to a protocol marked @objc
, that type must also marked with @objc
or the methods being used to satisfy the protocol must be.
Using @objc
on a declaration tells the compiler to expose it to the Objective-C runtime. In order for that to be possible, the type that was declared @objc
must be able to be represented in Objective-C.
For classes this means they must inherit from NSObject. For methods, this means they become backed by dynamic Objective-C message passing.