In Swift, protocols can inherit from one or more additional protocols. Let's see how and why to use it. Here we have a User protocol, this protocol will be getting bigger each time we add a new User requirement into it.
Mitrenegades solution is to use an objective-c protocol, is one way, but if you want a swift protocol, then the other would be to refactor the code so as to not use the objective-c class directly, but instead use the protocol (e.g. some protocol based factory pattern). Either way may be appropriate for your purposes.
A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of those requirements.
You can create objects from classes, whereas protocols are just type definitions. Try to think of protocols as being abstract definitions, whereas classes and structs are real things you can create.
Type 'CellDatasDataSource' does not conform to protocol 'NSObjectProtocol'
You have to make your class inherit from NSObject
to conform to the NSObjectProtocol
. Vanilla Swift classes do not. But many parts of UIKit
expect NSObject
s.
class CustomDataSource : NSObject, UITableViewDataSource {
}
But this:
Type 'CellDatasDataSource' does not conform to protocol 'UITableViewDataSource'
Is expected. You will get the error until your class implements all required methods of the protocol.
So get coding :)
A class has to inherit from a parent class before conform to protocol. There are mainly two ways of doing it.
One way is to have your class inherit from NSObject
and conform to the UITableViewDataSource
together. Now if you want to modify the functions in the protocol, you need to add keyword override
before the function call, like this
class CustomDataSource : NSObject, UITableViewDataSource {
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
// Configure the cell...
return cell
}
}
However this sometimes gets your code messy because you may have many protocols to conform to and each protocol may have several delegate functions. In this situation, you can separate the protocol conforming code out from the main class by using extension
, and you do not need to add override
keyword in the extension. So the equivalent of the code above will be
class CustomDataSource : NSObject{
// Configure the object...
}
extension CustomDataSource: UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
// Configure the cell...
return cell
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With