What exactly does `: class` do in a protocol declaration?
:class
ensures that only classes can implement the protocol. And that's any class, not just subclasses of NSObject
. @objc
, on the other hand, tells the compiler to use Objective-C-style message passing to call methods, instead of using a vtable to look up functions.
When to use `protocol` and `protocol: class` in Swift?
Swift 4 version
AnyObject
added to a protocol definition like this
protocol FilterViewControllerDelegate: AnyObject {
func didSearch(parameters:[String: String]?)
}
means that only a class will be able to conform to that protocol.
So given this
protocol FilterViewControllerDelegate: AnyObject {
func didSearch(parameters:[String: String]?)
}
You will be able to write this
class Foo: FilterViewControllerDelegate {
func didSearch(parameters:[String: String]?) { }
}
but NOT this
struct Foo: FilterViewControllerDelegate {
func didSearch(parameters:[String: String]?) { }
}
Swift 3 version
:class
added to a protocol definition like this
protocol FilterViewControllerDelegate: class {
func didSearch(Parameters:[String: String]?)
}
means that only a class will be able to conform to that protocol.
So given this
protocol FilterViewControllerDelegate: class {
func didSearch(Parameters:[String: String]?)
}
You will be able to write this
class Foo: FilterViewControllerDelegate {
func didSearch(Parameters:[String: String]?) { }
}
but NOT this
struct Foo: FilterViewControllerDelegate {
func didSearch(Parameters:[String: String]?) { }
}
what is that inheritance in protocol
class
in your case means that classes
only can implement your protocol
and not structs
.
What is a Protocol?
Here's a great article on it. Effectively, a protocol in Objective-C is very similar to an interface in Java or a pure virtual class in C++ (although not exactly as pure virtual classes can have data members...). It's basically a guarantee that a specific class knows how to respond to a given set of methods (messages).
Edit The original article disappeared so I have replaced it with a different tutorial.
What is the Difference Between Classes vs Protocols
A class serves as a blueprint for creating one or more objects based on specific implementation of that class.
A good analogy is a form for cutting out butter-cookies. The form‘s attributes (shape, size, height) define the cookies that you can cut out with it. You have only one form (class) but you can create many cookies (instances of that class, ie. objects) with it. All cookies are based on that particular form.
Similarily all objects that are instances of that class are identical in their attributes.
Classes = data and methods (special functions), all sophistically bundled together.
Classes define, what their inner content (data) is + what kind of work (methods) they can do.
The content is based on variables that hold various number types, strings, constants, and other more sophisiticated content + methods which are chunks of code that (when executed) perform some computational operations with various data.
All methods defined in class have their
Definition - that defines the name of the method + what (if any) data the methods takes in for processing and what (if any) data the methods spits out for processing by someone else. All methods defined in class also have Implementation – the actual code that provides the processing – it is the innerworkings of methods.. inside there is code that processes the data and also that is able to ask other methods for subprocessing data. So the class is a very noble type in programming.
If you understand the above, you will understand what a protocol is.
A protocol is a set of one or more method declarations and that set has a name and represents a protocol. I say declarations, because the methods that together are defined by a particular protocol, do not have any implementation code defined.. The only thing that exist is their names declared.
Look above - in class, you have always defined not only what methods the class has, but also how that work will be done. But methods in protocol do not have any implementation.
Lets have a real life analogy again, it helps. If you come to my house to live here for a week, you will need to adhere to my TidyUp protocol. The TidyUp protocol defines three methods - wash the dishes every day, clean the room, and ventilate fresh air. These three methods, I define them..are something you will do. But I absolutely do not care, how the implementation should look like, I just nominaly define the methods. You will implement them, ie.you define how the details of that work (those methods) will look like. I just say, adhere to my protocol and implement it as you see fit.
Finale – You can declare some class. You can separately also declare a protocol. And you can then declare, that this class, in addition to its own methods, will adopt or adhere to that protocol, ie. the class wil implement the protocol’s methods.
Do I want a @protocol declaration or something else to make sure sub-class defines selectors?
You can do something like this:
@protocol MyProtocol<NSObject>
@required
-(void) myRequiredMethod;
@optional
-(void) myOptionalMethod;
@end
And when you need to call an optional method, you do something like this:
if ([delegate respondsToSelector:@selector(myOptionalMethod)])
[delegate myOptionalMethod];
else
// abort, or ignore.
Using @class to get access to a delegate protocol declaration
You can only forward-declare a protocol in the same header file for usage in method return values or parameter types. In your case you want the class to conform to the protocol, so it won't work since it defines behavior that will be added to the class itself (i.e. the methods it will respond to).
Therefore, you must #import
the protocol. For this reason, it is probably a good idea to split the protocol and class up into separate files. See this answer for more information.
Related Topics
Core Data - Fetch All Entities Using the Same Field
Fetch() Doing Get Instead of Post on React-Native (iOS)
Runtime Error When Using Corefoundation Objects in a Swift Nsobject Subclass
How to Remove Popup Message of Nfc Tag in iOS
Retina Display Vs Normal Display Color Difference
Best Approach to Change Xib Direction Programmatically
How to Upload Multiple Images in Multipart Using Alamofire
iPhone - Memory Leak - Nsdata Datawithcontentsofurl & UIwebview
Fastlane Boarding with Two-Factor Authentication
Xcode UI Tests Can't Find Views That Are Added Programmatically
Nscoding Required Initializer in Inherited Classes in Swift
Calculate The Range of Visible Text in UIlabel
Is There a Way of Automatically Writing Custom Values to The Bundle's .Plist During a Build Phase
How to Disable The Display of The Notification Center When Pulling Down on The Screen
Avplayer Removing Observer Crash in Swift 2.2