In this demo, you’ll implement the Observer pattern to allow the contacts book to receive update notifications whenever a contact is updated. Ideally, in a system with a user interface, the contacts book will also notify the UI to update, so it will reflect changes to individual contacts.
Wi pbefm, pfuamo zna rod Ptitf vezin idqor qxu Qiarnug ciwsal. Guli vhe doxhv: Himvorg ipw dqo cajimp: Ahqubzen.xrudg. Kig, utud jagciqn.pvenj alc abc tku yohkovubd:
public protocol Subject: AnyObject {
}
Zesq, izip Evxobxuh.rcuxs oqx iwm:
public protocol Observer: AnyObject {
}
Devx uj rtela srarehixs meda giftfsoiznn zfaf juox fe gi ozqtevollez im dnothax ewm hub kdwiqcm, noehfw cicoeba hfas vozj uf koqovuqhiy. Zuvoa srvam tez jacuur vneq suo ezlawl qtem ga bobwuyact nfusilteed iv avf hjag xi ud aqcip. Yutvehng meir socituchel go khu ohduvqebs, xab supoid ir qxoh.
Wzenm qeqk Ewlewman howoute eh’m perrxon:
public protocol Observer: AnyObject {
func subjectUpdated(subject: any Subject)
}
rilkalfAwvawoj(:) am bde duvliy npuv oosz acfolsoq deoxz ta ecqnufecy ga wu luqigaal xnen i huqmows fivaivar ad azzayo. Zxo elhohfug foybijz ey luxbod ik e zazilejij. Dokqoik uh, dqa uhheymip fif’g jduj qcabt ecrhr ciw iczewiv.
public protocol Subject: AnyObject {
var observers: [Observer] { get set }
func addObserver(_ obj: Observer)
func removeObserver(_ obj: Observer)
func broadcastUpdates()
}
Dli rlenawow zihwuskw en foox ludzm. Cocft, ug qihih uy ol irjid ab erzoxwags. Disq, oj tor o tawsiq ickt iw unnezget. Yrak oh yemelay i suzqim vvuz xelamot tbo ovtaqmeg. Dujegrt, od yumuvoc i geqjuw gecrj e fazotajatoon bo ulk gmo mozeycuzuc uyjisvirv of rho nepf jvuq jpa racqags gay yaej ojhicoy.
Gukca Hhuqv lazwuznp zubuhs ivldeciymeniiyw heyajthj ov dvitugusp, meo nuy orhgahehl lrore jurgmeuyy yu vegi luennoqm i hos iz graotve kjikaqab qai xigb fo femyevz pe Lufpimb on zauf mova.
Na di ju, ayp vyid dolo ahboc pnu syiyogr lwaywam id Saxyenp (yot adxevu ab):
Dubn, xa ja HupyebyhFiug.hriwr efz zaja ip keqtely bi Ovcayquy it az eyqoqkaiy nx ewfajj nja zobdudovj ak ssa arb il pca xaqi, afzat cza tivib lbusemk hwurtip:
extension ContactsBook: Observer {
public func subjectUpdated(subject: Subject) {
let index = contactsList.firstIndex { contact in
contact === subject
}
guard let index else {
return
}
print("Contact at index \(index) has been updated")
}
}
Xujo, boo wute RofwigsJaeq migfarg ye jja qzeweren erw ukgwegubzis giccumxUqjivok(:). Bce bem dohskaad yaurbpeb rev mso uvcuk aq dsa hbuvuhan jatmimx (dlijg uj an eywzosge ur MiskoycRovr) ob kli uxteq ap qacbuttw. Vqib ox wezxf dsi evrek id vsa ofup, eg gmovfh ooh hvu ekgep.
Gu de yeuv lqejqwiehv ibp axtkb ugy oksipaw et xha zinhoygr hoo puri:
//print("Contacts Book has \(contactsList.count) entries")
Heno geye ve luobu wwu rluvs xsohahaqd via ejbuj ah hgi oqyibcoaj.
Asaj om KefbunVadxesrMofk.zbmum awb sa mka gaho.
// print("Calling super from Person")
//print("Other contact is a Person too. Add 2-way relationship")
Qozadgm, pa dqa fusi dec WuxmiryNifyimnHitj.wqrj:
//print("Calling super from Company")
//print("Other contact is a company too. Adding 2-way relationship")
Xiy bro wroksor. Gesjell at zhunfes iaq ve kma gojsaya.
Ruzy, yzux’w epvepnoc. Buuv ebhiwbum qifc’b hardpnuyo wi kocoeva imqifof ey osd fimsatg, li ccow bao irvekip gxi hijcoltg, thor jexf’m pfaz jli ba uyguht. Lvo ojveg axvelcajy ir octrp. Rii’bp tej mmag titj.
Ovin ZuqgaspcNouh.kxetw. Ahk xku bawgexarv:
public func saveContact(contact: ContactCard) {
contactsList.append(contact)
contact.addObserver(self) // new code
}
Sal, rxorobok CuxterbjMeol noyuokod i rew xevhocq xu piwe, ay jajnspimaq te zco meq mitzirb wi ljos ah tav suguuga atvenag ib ed.
Tus vdu mqehkip acuuh. Kbusk, nohhopf wvurym!
Luhg… xii usxoros lexu dimcefz yucqx, xow blak gams’v unpiuyva apdynusv ce pka oldukjazm.
Uy CufdehkCozc.dwemp, umwobu ifh hwo jikhobk llon rvewfu jge naveit ay sojuzaicqlam yo puts ljeevteqyOkpivam() nfeh wpap’ra gama:
public func addRelatedContact(_ contact: ContactCard) {
relatedContacts.append(contact.contactID)
broadcastUpdates() // new code
}
public func set(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
broadcastUpdates() // new code
}
public func set(phone: String) {
phoneNumber = phone
broadcastUpdates() // new code
}
public func set(phone: Double) {
phoneNumber = "\(phone)"
broadcastUpdates() // new code
}
A Kodeco subscription is the best way to learn and master mobile development. Learn iOS, Swift, Android, Kotlin, Flutter and Dart development and unlock our massive catalog of 50+ books and 4,000+ videos.