Hordhac Hello! Magacaygu waa Kiryl Famin, waxaana ahay horumariye iOS ah. Maanta, waxaan rabaa in aan si fiican u baaro mawduuc fudud sida kuwa bilowga ah ee Swift. Inkasta oo ay si fudud u muuqato, mararka qaarkood la'aanta mawduucan waxay keentaa khaladaad niyad jab leh oo qofku rabo inuu si dhakhso ah u hagaajiyo isaga oo aan faahfaahinta faahfaahin. faham Maqaalkan, waxaan ku dabooli doonaa wax kasta oo la xiriira bilowga, oo ay ku jiraan: Sida loo sii hayo qaab-dhismeedka bilowga xubin ahaan iyadoo la qeexayo mid caado ah Waa maxay sababta aysan had iyo jeer lagama maarmaan u ahayn in fasalada lagu qoro bilowga Waa maxay sababta wacitaanka aan had iyo jeer looga baahnayn bilowga la qoondeeyey super.init Waa maxay sababta dhammaan qaybaha fasal-hoosaadka ay tahay in la buuxiyo ka hor inta aan la wicin super.init Sida loo galo dhammaan bilawga waalidka oo leh xad-dhaaf yar oo fasal-hoosaad ah Marka si sax ah loo bilowga loo baahan yahay required Waa maxay sababta had iyo jeer loogu yeeraa iyada oo aan la xaddidin, laakiin iyo waa la tirtiray UIView.init() init(frame:) init(coder:) ...iyo qaar kaloo badan. Laakiin aan u qaadno tallaabo tallaabo. Tusmada Tusmada Aasaaska Qaab dhismeedka Bilowga xubin ahaan Ikhtiyaarka vs var let Haysashada bilowga xubin ahaan Fasallada Bilowga loo qoondeeyay Bilawga ku habboonaanta Haysashada bilowga ku habboonaanta superclass Yaraynta tirada xad dhaafka ah Caawinta iskudubaridka bilowga : generics, protocols, , required Self() final oo aan xuduud lahayn UIView() Xusid mudan Fashilmay init Enums Soo koobid Xiriirinta laxiriirta Aasaaska Tusaha Apple (kaaso, si la yaab leh, si la yaab leh loogu faahfaahiyay bilowga) wuxuu leeyahay: The Swift Programming Language (6) waa habka diyaarinta tusaale ahaan fasalka, qaab-dhismeedka, ama tirinta isticmaalka. Habkani waxa uu ku lug leeyahay dejinta qiimaha bilowga ah ee hanti kasta oo kaydsan tusaale ahaanas iyo samaynta habayn kale ama bilaabista kale ee loo baahan yahay ka hor inta aan tusaalaha cusub diyaar u ahayn isticmaalka. Bilawga Waxaad fulisaa habkan bilawga ah adoo qeexaya , kuwaas oo la mid ah hababka gaarka ah ee loogu yeero si loo abuuro tusaale cusub oo nooc gaar ah. Si ka duwan kuwa bilowga ah Objective-C, bilowga hore ee Swift ma soo celiyaan qiime. Doorkooda aasaasiga ah waa inay hubiyaan in xaaladaha cusub ee nooc si sax ah loo bilaabay ka hor inta aan la isticmaalin markii ugu horeysay. bilawga Hagaag, waxaan filayaa inaanan waxba halkan ku darin. Qaab dhismeedka Aan ku bilowno ka doodista qaab-dhismeedka bilowga. Tani waa arrin sahlan maadaama aysan jirin dhaxal, laakiin weli waxaa jira xeerar ay tahay inaad wax ka ogaato. Bilowga xubin ahaan Aynu qorno qaab-dhismeed fudud: struct BankAccount { let amount: Double let isBlocked: Bool } let bankAccount = BankAccount(amount: 735, isBlocked: Bool) U fiirso inaan awoodnay inaan bilowno qaab dhismeedka anagoon si cad u sheegin wax bilow ah. Tani waxay dhacdaa sababtoo ah dhismooyinku waxay helayaan oo uu soo saaray iskudubariduhu. Tani waxay . bilawga xubin ahaan xubin ka ah u shaqaysaa oo kaliya dhismayaasha Markaad doorato , waxaad arki kartaa sida ay u egtahay: Refactor → Samee bilawga xubin ahaan init(amount: Double, isBlocked: Bool) { self.amount = amount self.isBlocked = isBlocked } Saxiixa marka la eego, way fududahay in la arko in ku guuldaraysiga bixinta qiyamka dhammaan cabbirada ay keeni doonto khalad isku-ururin: let bankAccount = BankAccount(amount: 735) // ❌ Missing argument for parameter 'isBlocked' in call Si kastaba ha noqotee, haddii aad rabto inaad yareyso tirada doodaha loo baahan yahay, waxaad qeexi kartaa bilowga caadada: init(amount: Double, isBlocked: Bool = false) { self.amount = amount isBlocked = isBlocked } let bankAccount = BankAccount(amount: 735) // ✅ Ogsoonow in haddii aan la dajin, tani waxay keenaysaa qalad la isku duba ridey sababtoo ah . isBlocked dhammaan guryaha dhismuhu waa in lagu buuxiyaa bilowga vs Ikhtiyaarka, var let Kiiska kaliya ee aan garoonku u baahnayn in loo dajiyo waa marka ay tahay ( ) ( ). Xaaladahan oo kale, goobta ayaa noqon doonta : si cad doorsoome ikhtiyaari ah ? var nil struct BankAccount { let amount: Double var isBlocked: Bool? init(amount: Double) { self.amount = amount } } let bankAccount = BankAccount(amount: 735) // ✅ Si kastaba ha ahaatee, haddii aan isku dayno inaan isticmaalno bilawga xubin ahaan kiiskan, waxaan heli doonaa qalad isku dubarid: let bankAccount = BankAccount( amount: 735, isBlocked: false ) // ❌ Extra argument 'isBlocked' in call Haysashada bilowga xubin ahaan Tani waxay dhacdaa sababtoo ah ku dhawaaqida bilawga caadadu waxay meesha ka saaraysaa bilawga xubin ahaan. Wali waa suurtogal in si cad loo qeexo, laakiin si toos ah uma heli doono. Si kastaba ha ahaatee, waxaa jira khiyaamo yar oo lagu hayo bilawga xubin ahaan: ku dhawaaq bilawga caadada ee . extension struct BankAccount { let amount: Double var isBlocked: Bool? } extension BankAccount { init(amount: Double) { self.amount = amount } } let barclaysBankAccount = BankAccount(amount: 735) // ✅ let revolutBankAccount = BankAccount(amount: 812, isBlocked: false) // ✅ print(barclaysBankAccount.isBlocked) // nil print(barclaysBankAccount.isBlocked) // false Soo koobida dhismayaasha Dhammaan goobaha waa in lagu buuxiyaa bilowga Ikhtiyaarka var beeruhu waa nil Dhismayaashu waxay helayaan bilawga xubin ka ah oo bilaash ah Bilawga xubin ahaanta ka tirsani wuu baaba'ayaa haddii lagu dhawaaqo bilowga hore Si aad u sii haysato bilawga qaab-dhismeedka xubin ahaan, qeex mid gaar ah oo ku jira extension Fasallada Bilowga loo qoondeeyay Bilawga aasaasiga ah ee fasalka waa . Waxay u adeegtaa laba ujeedo: bilawga la qoondeeyey Waxay hubisaa in dhammaan beeraha ay dadku ku badan yihiin Haddii fasalka la dhaxlo, waxay wacdaa bilowga heerka sare class Animal { var name: String init(name: String) { self.name = name } } class Dog: Animal { var breed: String var name: String init(breed: String, name: String) { self.breed = breed super.init(name: name) } } Dhammaan goobaha la wicin . Tani waa sababta oo ah bilawga superclass wuxuu u yeeri karaa hababka ay dhaafeen fasalka hoose, kaas oo geli kara guryaha dabaqa hoose ee aan la dajin. waa in la buuxiyaa ka hor inta aan super.init class Animal { var age: Int init(age: Int) { self.age = age getInfo() } func getInfo() { print("Age: ", age) } } class Dog: Animal { var breed: String init(breed: String, age: Int) { self.breed = breed // imagine we haven't done this super.init(age: age) } override func getInfo() { print("Age: ", age, ", breed: ", breed) } } Sidaas darteed, haddii aynaan dejin , waxaan la kulmi lahayn qalad runtime ah sababtoo ah bilawga wuxuu ugu yeeri lahaa habka ee fasalka . Habkani wuxuu isku dayaa inuu galo hantida , kaas oo aan wali la dajin. self.breed = breed Animal getInfo() Dog breed Si ka duwan qaab-dhismeedka, fasaladu ma helaan bilawga xubin ahaan oo daahsoon. Haddii ay jiraan guryo aan la bilaabin, khalad ururin ayaa dhacaya: class Animal { // ❌ Class 'Animal' has no initializers var age: Int } class Animal { // ✅ var age: Int = 0 } class Animal { // ✅ var age: Int? } class Animal { } // ✅ Bilawga ku habboonaanta Fasallada sidoo kale waxay yeelan karaan . Si ka duwan kuwa bilowga ah ee loo qoondeeyay, kama abuuraan shay meel xoq ah, laakiin waxay fududeeyaan habka bilowga iyagoo dib u isticmaalaya macquulka bilowgayaasha kale. bilow fududeeye class Rectangle { var width: Double var height: Double init(width: Double, height: Double) { self.width = width self.height = height } convenience init(side: Double) { self.init(width: side, height: side) // uses a designated initializer of self } } Bilaabayaasha fududeyaashu waxay wici karaan kuwa la qoondeeyay ama kuwa kale ee fududaynta. Ugu dambayntii, bilawga la qoondeeyey ayaa had iyo jeer la wici doonaa. Bilaabayaasha fududaynta had iyo jeer waxay u socdaan toosan (self.init), iyo kuwa bilawga loo qoondeeyay waxay u socdaan toosan (super.init). Haysashada bilawga ku habboonaanta Superclass Isla marka fasal-hoosaadku uu ku dhawaaqo hanti cusub, waxay luminaysaa gelitaanka dhammaan kuwa bilowga ah ee ku habboon heerka sare. class Animal { var age: Int var name: String init(age: Int, name: String) { self.age = age self.name = name } convenience init(age: Int) { self.init(age: age, name: "Default") } convenience init(name: String) { self.init(age: 0, name: name) } } class Dog: Animal { var breed: String init(age: Int, name: String, breed: String) { self.breed = breed super.init(age: age, name: name) } } let dog = Dog(age: 3) // ❌ Missing arguments for parameters 'breed', 'name' in call Tan waxa lagu hagaajin karaa iyada oo meesha laga saarayo . dhammaan bilawga heer-sare ee loo qoondeeyay class Dog: Animal { // ... override init(age: Int, name: String) { self.breed = "Mixed" super.init(age: age, name: name) } } let dog = Dog(age: 3) // ✅ Way fududahay in la arko in, habkan, si aad u isticmaasho bilawga ku habboon fasalka hoose ee soo socda, waxaad u baahan tahay inaad ka gudubto bilawga. laba class GuideDog: Dog { var isTrained: Bool override init(age: Int, name: String) { self.isTrained = false super.init(age: age, name: name) } override init(age: Int, name: String, breed: String) { self.isTrained = false super.init(age: age, name: name, breed: breed) } init(age: Int, name: String, breed: String, isTrained: Bool) { self.isTrained = isTrained super.init(age: age, name: name, breed: breed) } } let dog = GuideDog(age: 3) // ✅ Yaraynta tirada xad dhaafka ah Si kastaba ha ahaatee, tan waxaa looga fogaan karaa iyadoo la isticmaalo . bilowga hore ka-hortagga habboon class Dog: Animal { var breed: String convenience override init(age: Int, name: String) { self.init(age: age, name: name, breed: "Mixed") // self, not super } init(age: Int, name: String, breed: String) { self.breed = breed super.init(age: age, name: name) } } class GuideDog: Dog { var isTrained: Bool // override init(age: Int, name: String) { // self.isTrained = false // // super.init(age: age, name: name, breed: "Mixed") // } convenience override init(age: Int, name: String, breed: String) { self.init(age: age, name: name, breed: breed, isTrained: false) // self, not super } init(age: Int, name: String, breed: String, isTrained: Bool) { self.isTrained = isTrained super.init(age: age, name: name, breed: breed) } } let dog = GuideDog(age: 3) // ✅ Hadda waxaan haysanaa 2 bilow oo si cad u qeexan fasal hoose kasta. is-aqooneed halkii ay ka ahaan lahaayeen . Fiiro u yeelo sida ku habboonaanta kuwa bilowga ah ugu yeeraan self super.init Khiyaamadan waxa si fiican loogu sharaxay cutubka 5 ee oo uu qoray Tjeerd ee 't Veen, buug aan aad ugu talinayo. Swift in Depth Soo koobid dhexdhexaad ah wuxuu hubinayaa in dhammaan guryaha la wada buuxo oo wac . Bilawga la qoondeeyey super.init() wuxuu fududeeyaa bilawga isagoo wacaya bilawga loo qoondeeyay. Bilawga fududaysta waxay noqotaa mid aan la heli karin fasal-hoosaadyada haddii ay ku dhawaaqaan guryo cusub. Bilowga ku habboonaanta Si loo soo superclass , dhammaan curiyeyaasha loo qoondeeyay waa in la buriyo. celiyo fududeeyaha Si loo yareeyo tirada ka-hortagga, ayaa la isticmaali karaa. ku habboonaanta bilawga beddelka Caawinta iskudubaridka Waxaan mar hore ka wada hadalnay in haddii fasal-hoosaadku aanu soo bandhigin cabbirro cusub, uu si toos ah u dhaxlo dhammaan bilawga heerka sare. class Base { let value: Int init() { value = 0 } init(value: Int) { self.value = value } } class Subclass: Base { } let subclass = Subclass() // ✅ let subclass = Subclass(value: 3) // ✅ Si kastaba ha ahaatee, waxaa jira qodob kale oo muhiim ah: haddii superclass uu leeyahay hal bilow oo loo qoondeeyay oo uu yahay mid aan lahayn ( dood la'aan), ka dibna bilawga si cad loogu dhawaaqay fasalka hoose inuu waco . Xaaladdan oo kale, compiler-ka Swift wicitaanka ee jira iyaddoo aan dood lahayn. init() uma baahna super.init() wuxuu si toos ah u gelinayaa super.init() class Base { init() { } } class Subclass: Base { let secondValue: Int init(secondValue: Int) { self.secondValue = secondValue // ✅ without explicit super.init() } } Koodhku wuxuu ururiyaa sababtoo ah ayaa si maldahan loogu yeedhay. Tani waxay muhiim u tahay qaar ka mid ah tusaalooyinka soo socda. super.init() Loo baahan yahay Bilawga ayaa loo isticmaalaa dhammaan xaaladaha ay tahay in fasal-hoosaadku leeyahay isla bilowga fasalka aasaasiga ah. Waa inay sidoo kale wacdo . Hoos waxaa ku yaal tusaalayaal marka bilowga uu lagama maarmaan yahay. required super.init() required Generics U yeedhida nooca guud waxa ay suurta gal tahay oo kaliya in lagu dhawaaqo sidii . init required init class Base { } class Subclass: Base { } struct Factory<T: Base> { func initInstance() -> T { // ❌ Constructing an object of class T() // type 'T' with a metatype value } // must use a 'required' initializer } Xeerkani ma ururiyo sababtoo ah waxba kama oga qaybaha hoose ee . In kasta oo kiiskan gaarka ah, uu leeyahay iyada oo aan xuduud lahayn, qiyaas haddii ay soo bandhigtay goob cusub: Factory Base Subclass init() class Subclass: Base { let value: Int init(value: Int) { self.value = value } } Halkan , hadda ma laha madhan , marka waa in lagu dhawaaqaa sida . init required class Base { required init() { } } class Subclass: Base { } struct Factory<T: Base> { static func initInstance() -> T { // ✅ T() } } let subclass = Factory<Subclass>.initInstance() U fiirso inkasta oo aynaan si cad ugu dhawaaqin , iskudubariduhu waa inoo soo saaray. Tan waxa lagaga hadlay . si toos ah ayaa loo dhaxlay waxaana loo yaqaan . required init Subclass Caawimaadda Compiler required init super.init() class Subclass: Base { required init() { super.init() } } Habmaamuuska Dhammaan curiyeyaasha lagu sheegay borotokoolka waa in : required protocol Initable { init() } class InitableObject: Initable { init() { // ❌ Initializer requirement 'init()' can only // be satisfied by a 'required' initializer } // in non-final class 'InitableObject' } Mar labaad, tani waa lagama maarmaan si uu isu-dubariduhu u hubiyo in fasalka-hoosaadku hirgeliyo bilawga borotokoolka. Sidaan horayba u ognahay, tani had iyo jeer ma dhacdo-haddii aan , fasalka-hoosaadku waajib kuma aha inuu ka gudbo oo waxa laga yaabaa inuu qeexo bilawgiisa. init required class IntValue: InitableObject { let value: Int init(value: Int) { self.value = value } } let InitableType: Initable.Type = IntValue.self let initable: Initable = InitableType.init() Dabcan, koodka soo socda ma ururin doono sababtoo ah looma . Base.init() required class InitableObject: Initable { required init() { } // ✅ } class IntValue: InitableObject { let value: Int required init() { self.value = 0 } init(value: Int) { self.value = value } } Nafta() Xaalad la mid ah ayaa dhacda marka la wacayo bilawga ee hababka taagan. Self() class Base { let value: Int init(value: Int) { self.value = value } static func instantiate() -> Self { Self(value: 3) // ❌ Constructing an object of class type 'Self' } // with a metatype value must use a 'required' initializer } Sida had iyo jeer, arrintu waxay ku jirtaa dhaxalka: class Subclass: BaseClass { let anotherValue: Int init(anotherValue: Int) { self.anotherValue = anotherValue } } let subclass = Subclass.instantiate() // ❌ class BaseClass { let value: Int required init(value: Int) { // ✅ self.value = value } static func instantiate() -> Self { Self(value: 3) } } Ka takhalusidda : required final Maadaama ujeedada ay tahay in la dhaqan geliyo hirgelinta bilowga fasal-hoosaadyada, dabiici ahaan, mamnuucidda dhaxalka iyadoo la adeegsanayo ereyga muhiimka ah waxay meesha ka saaraysaa baahida loo qabo in lagu calaamadiyo bilowga sida . required final required protocol Initable { init() } final class InitableObject: Initable { } // ✅ protocol ValueInitable { init(value: Int) } final class ValueInitableObject: ValueInitable { init(value: Int) { } // ✅ } Soo koobid dhexdhexaad ah Haddii fasal-hoosaadku aanu soo bandhigin cabbirro cusub, wuxuu si toos ah u dhaxlayaa dhammaan bilawgayaasha heerkiisa sare. Haddii heerka sare uu leeyahay oo keliya iyada oo aan la xaddidin, waxaa si toos ah loogu yeeraa bilowga fasalka hoose. init() Bilawga ayaa loo baahan yahay si loo dammaanad qaado joogitaankeeda fasal-hoosaadyada si loogu isticmaalo guud ahaan, borotokoolka, iyo . required Self() UIView() Xusid kooban oo ku saabsan bilowga bilaa cabbir, kaas oo aan laga heli karin dukumeentiyada laakiin si qarsoodi ah meel walba looga isticmaalo. UIView() Sababtu waa waxay ka dhaxashay , kaas oo leh oo aan xuduud lahayn. , bilawga si cad looguma dhawaaqin interface , weli waa la heli karaa: UIView NSObject init() Sidaa darteed UIView @available(iOS 2.0, *) @MainActor open class UIView : UIResponder, NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, UIFocusItemContainer, CALayerDelegate { open class var layerClass: AnyClass { get } public init(frame: CGRect) public init?(coder: NSCoder) open var isUserInteractionEnabled: Bool // no init() Si kastaba ha ahaatee, hoosta daboolka, bilawgani wuxuu wacaa marka lagu bilaabo koodka ama marka lagu bilaabo Interface Builder. Tani waxay dhacdaa sababtoo ah waxay bixisaa hirgelinteeda , taas oo lagu xaqiijin karo xaqiiqda ah in uu soo celiyo ciwaano kala duwan iyo . init(frame:) init(coder:) UIView NSObject.init() method_getImplementation NSObject.init() UIView.init() Xusid mudan Fashilmay init Meesha aan shaqayn karin waa mid soo celisa ikhtiyaari ikhtiyaari ah final class Failable { let positiveValue: Int init?(value: Int) { guard value > 0 else { return nil } positiveValue = value } } Enum Enums leh qiima cayriin waxay helayaan lacag la'aan init?(rawValue:) enum Direction: String { case north case west case south case east } let north = Direction(rawValue: "north") Waxa kale oo aad samayn kartaa init gaar ah ee tirooyinka. Dhammaan tirooyinka waa inay isu xil saaraan. self enum DeviceType { case phone case tablet init(screenWidth: Int) { self = screenWidth > 800 ? .tablet : .phone } } Soo koobida kama dambaysta ah Waxaan daboolnay dhammaan dhinacyada muhiimka ah ee bilowga ah ee Swift: Bilawga, dhammaan goobaha waa in la buux dhaafiyaa. Guryaha ee ikhtiyaarka ah waxay ku xiran yihiin . var nil Qaab-dhismeedyadu waxay helayaan oo bilaash ah. bilawga xubin ka ah marka bilawga caadada ah la qeexo. Bilawga xubin ahaanta ka tirsani waxa uu baaba'aa wuxuu xaqiijiyaa in dhammaan goobaha dadku ku badan yihiin oo wacaa . Bilawga la qoondeeyey super.init() wuxuu fududeeyaa bilawga isagoo wacaya bilawga loo qoondeeyay. Bilawga fududaysta Bilaabayaasha fududaynta waxay had iyo jeer u socdaan ( ), iyo bilawga la qoondeeyay waxay u socdaan ( ). toosan self.init toosan super.init waxay noqotaa mid aan la heli karin fasal-hoosaadyada haddii ay ku dhawaaqaan guryo cusub. Bilowga ku habboonaanta Si loo soo superclass , dhammaan curiyeyaasha loo qoondeeyay waa in la buriyo. celiyo fududeeyaha Si loo yareeyo tirada ka-hortagga, ayaa la isticmaali karaa. ku habboonaanta bilawga beddelka Haddii fasal-hoosaadku aanu soo bandhigin cabbirro cusub, wuxuu si toos ah u dhaxlayaa dhammaan bilawgayaasha heerkiisa sare. Haddii heerka sare uu leeyahay oo kaliya iyada oo aan la xaddidin, si toos ah ayaa loogu yeeraa bilowga fasalka hoose. init() wuxuu xaqiijiyaa joogitaanka fasalada hoose si loogu isticmaalo guud ahaan, borotokoolka, iyo . Bilowga loo baahan yahay Self() wac ama . UIView.init() UIView.init(frame:) UIView.init(coder:) wuxuu soo celiyaa ikhtiyaari ikhtiyaari ah. Bilawga fashilmay Enums leh qiima cayriin waxay helayaan lacag la'aan . init?(rawValue:) Dhammaan curiyeyaasha tirooyinka waa inay isu xil saaraan. self Waxaan rajeynayaa inaad ka heshay maqaalkan wax faa'iido leh. Haddi ay jiraan wax aan caddayn ama aad khalad u aragto, xor ayaad u tahay inaad ila soo xidhiidho si aan sharaxaad bilaash ah uga helo Telegram: . @kfamyn Xiriirinta laxiriirta Luuqadda Swift Programming Language (6) / Bilawga Degdega Qoto dheer ee uu qoray Tjeerd ee 't Veen Telegram - @kfamyn