Fist of all let me emphasize that, that is the actual world illustration of what we will construct on this little Swift adapter sample tutorial:
Adapter is a structural design sample that permits objects with incompatible interfaces to work collectively. In different phrases, it transforms the interface of an object to adapt it to a special object.
So adapter can remodel one factor into one other, generally it is referred to as wrapper, as a result of it wraps the article and gives a brand new interface round it. It is like a software program dongle for particular interfaces or legacy courses. (Dongle haters: it is time to depart the previous behind!) 😂
Adapter design sample implementation
Creating an adapter in Swift is definitely an excellent straightforward process to do. You simply have to make a brand new object, “field” the previous one into it and implement the required interface in your new class or struct. In different phrases, a wrapper object will likely be our adapter to implement the goal interface by wrapping an different adaptee object. So once more:
The article we’re adapting to a selected goal (eg. old-school USB-A port).
An object that wraps the unique one and produces the brand new necessities specified by some goal interface (this does the precise work, aka. the little dongle above).
It’s the object we need to use adaptee with (our USB-C socket).
Easy methods to use the adapter sample in Swift?
You should utilize an adapter if you wish to combine a third-party library in your code, however it’s interface would not match together with your necessities. For instance you possibly can create a wrapper round a whole SDK or backend API endpoints with a view to create a typical denominator. 👽
In my instance, I will wrap an EKEvent object with an adapter class to implement a model new protocol. 📆
import Basis import EventKit protocol Occasion var title: String get var startDate: String get var endDate: String get class EventAdapter non-public lazy var dateFormatter: DateFormatter = let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy. MM. dd. HH:mm" return dateFormatter () non-public var occasion: EKEvent init(occasion: EKEvent) self.occasion = occasion extension EventAdapter: Occasion var title: String return self.occasion.title var startDate: String return self.dateFormatter.string(from: occasion.startDate) var endDate: String return self.dateFormatter.string(from: occasion.endDate) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MM/dd/yyyy HH:mm" let calendarEvent = EKEvent(eventStore: EKEventStore()) calendarEvent.title = "Adapter tutorial deadline" calendarEvent.startDate = dateFormatter.date(from: "07/30/2018 10:00") calendarEvent.endDate = dateFormatter.date(from: "07/30/2018 11:00") let adapter = EventAdapter(occasion: calendarEvent)
One other use case is when you must use a number of present ultimate courses or structs however they lack some performance and also you need to construct a brand new goal interface on prime of them. Typically it is a good selection to implement an wrapper to deal with this messy state of affairs. 🤷♂️
That is all in regards to the adapter design pattern. Often it is very easy to implement it in Swift – or in every other programming language – however it’s tremendous helpful and generally unavoidable. Children, keep in mind: do not go too laborious on dongles! 😉 #himym