As in most cases with Swift, you can’t actually declare optional methods in a protocol. However, the behaviors, which are optional in this case, can be implemented using protocol extensions in conjunction with default implementations.
Using Extensions:
Define a Protocol: You just have to create your protocol with the methods you want.
Use Protocol Extensions: The default implementation of all the methods in a protocol extension. By doing so, conforming types can decide to provide their own implementations if they wish to do so.
Here’s an example:
protocol MyProtocol {
func requiredMethod()
func optionalMethod() // This method will not be optional yet
}
extension MyProtocol {
func optionalMethod() {
// Default implementation
print("Default optional method implementation")
}
}
class MyClass: MyProtocol {
func requiredMethod() {
print("Required method implementation")
}
// Uncommenting this will override the default optional method
// func optionalMethod() {
// print("Custom optional method implementation")
// }
}
let myClassInstance = MyClass()
myClassInstance.requiredMethod() // Output: Required method implementation
myClassInstance.optionalMethod() // Output: Default optional method implementation
Using Objective-C methods:
If you require optional methods, similar to those in Objective-C protocols, you can use @objc which shows your Swift protocol is compatible with Objective-C, and then declare methods as optional by using the @objc optional keyword. However, this means that for these new types, they have to be a subclass of NSObject.
Here’s how it looks:
@objc protocol MyObjectiveCProtocol {
func requiredMethod()
@objc optional func optionalMethod() // Optional method
}
class MyObjCClass: NSObject, MyObjectiveCProtocol {
func requiredMethod() {
print("Required method implementation")
}
// optionalMethod can be implemented or omitted
}
let myObjCInstance = MyObjCClass()
myObjCInstance.requiredMethod() // Output: Required method implementation
myObjCInstance.optionalMethod?() // Safe call; may or may not execute
When it comes to pure Swift protocols, all default implementations should be placed in extensions. In order to make methods optional for Objective-C compatibility use the @optional keyword.
Ready to transform your business with our technology solutions? Contact Us today to Leverage Our iOS Expertise.