Kamisaki! Nayan sutijax Kiryl Famin satawa, ukat nayax iOS ukan irnaqiritwa.
Jichhürunakanxa, Swift ukan inicializadores ukham mä sanu tema ukar sum uñakipañ munta. Ukham jan chʼamäkaspas ukhamäkchisa, awisajj uka toqet jan sum amuytʼasajja, jan waltʼayir pantjasiwinakaruw puriyi, uka pantjasiwinakjja, jan sum amuytʼasisaw jankʼak askichañ muni.
Aka qillqatanx taqi kunatix qalltawimp chikt’atäki ukanak uñakipt’añäni, ukanakax akanakawa:
Kunjamas estructura ukan miembron inicializador ukax mä costumbre ukar uñt’ayañkamax katxaruñapa
Kunatsa jan sapa kutix clasenakan mä inicializador qillqañax wakiskiti
Kunatsa super.init
jawsañax janiw sapa kutix mä designado inicializador ukanx wakiskiti
Kunatsa mä subclase ukan taqpach yapunakapax janïr super.init
ukar jawsañkamax phuqhantatäñapa
Kunjamas taqi awki tayka qalltayirinakarux jisk’a ch’amanchawinakampi subclases ukan mantañax
Kunapachatixa chiqapa mä required
ukaxa wakisi
Kunatsa UIView.init()
ukax sapa kutiw jan parámetros ukanakamp jawsatäna, ukampis init(frame:)
ukat init(coder:)
ukax chhaqtayatawa
...ukat juk’ampinaka. Ukampis mä jukʼat mä jukʼa parltʼañäni.
var
vs ukax let
required
qalltiri: genéricos, protocolos, Self()
, final
UIView()
ukax mä parámetros ukaniwaApple ukan guia The Swift Programming Language (6) (ukax, chiqans, muspharkañ uñt’ayatawa inicializadores ukanakataki) akham siwa:
Initialización ukax mä instancia de clase, estructura jan ukax enumeración ukanak apnaqañatakiw wakicht’i. Aka lurawixa sapa imatäki uka yänakatakixa qallta chanipa utt’ayañawa ukatxa yaqha wakicht’awi jan ukaxa qalltawi lurañawa kunatixa wakisi janïra machaq uñacht’awixa apnaqañataki wakicht’atäkipana.
Aka qalltañ lurawix phuqhachatawa qalltawinak uñt’ayasa , ukax kunayman thakhinakjamawa, ukax mä machaq instancia lurañatakiw jawsatäspa, mä kasta kasta. Objetivo-C qalltayirinakat sipansa, Swift qalltirinakax janiw mä chimpu kutt’ayapkiti. Jupanakan nayrïr lurawipax machaq instancias de un tipo ukanakax chiqapar qalltañapatakiw janïr nayrïr kuti apnaqañkama.
Suma, nayax amuyta janiw kunas akan yapxatañax wakiskiti.
Qalltañatakix estructura inicializadores ukanakat aruskipt’añäni. Ukax wali ch’amawa kunatix janiw herenciax utjkiti, ukampis yaqhip kamachinakax utjaskakiwa, ukanak yatiñax wakisiwa.
Mä sanu lurawi qillqt’añäni:
struct BankAccount { let amount: Double let isBlocked: Bool } let bankAccount = BankAccount(amount: 735, isBlocked: Bool)
Uñakipt’añatakix mä qalltayirir jan qhan uñt’ayasax estructura ukar qalltañ atipxtanxa. Ukax lurasiwa kunatix estructuras ukanakax mä miembro inicializador ukar katuqapxi, ukax compilador ukan luratawa. Ukax estructuras ukanakatakik irnaqaski .
Refactor → Generar inicializador de miembros ukar ajllisaw kunjams uñstaski uk uñjasma:
init(amount: Double, isBlocked: Bool) { self.amount = amount self.isBlocked = isBlocked }
Firma tuqitxa, taqi parámetros ukanakatakix valores ukanakax jan churañax mä compilación pantjasiw utjayaspa uk uñjañax jasakiwa:
let bankAccount = BankAccount(amount: 735) // ❌ Missing argument for parameter 'isBlocked' in call
Ukampirus, wakiskir argumientunak jisk’achañ munsta ukhax mä costumbre inicializador ukar uñt’ayasma:
init(amount: Double, isBlocked: Bool = false) { self.amount = amount isBlocked = isBlocked } let bankAccount = BankAccount(amount: 735) // ✅
Qhanacht’añatakix isBlocked
ukax janiw phuqhantatäkiti, ukax mä pantjasiw compilación ukaruw purini kunatix taqi propiedades de estructura ukax mä inicializador ukan phuqhantatäñapawa .
var
vs let
Mä yapux janiw qhananchañax wakiskiti, ukax mä variable opcional ( ?
) ( var
) ukhamawa. Ukhamächi ukhaxa, yapux nil
ukar uñtatawa :
struct BankAccount { let amount: Double var isBlocked: Bool? init(amount: Double) { self.amount = amount } } let bankAccount = BankAccount(amount: 735) // ✅
Ukampirus, aka tuqinx memberwise initializer uka apnaqañ yant’añäni ukhax mä compilación pantjasiw jikxatañäni:
let bankAccount = BankAccount( amount: 735, isBlocked: false ) // ❌ Extra argument 'isBlocked' in call
Ukax lurasi kunatix mä inicializador costumbre ukar uñt’ayañax miembros inicializadores ukarux apsuwayiwa. Wali qhananchañax wakisiwa, ukampis janiw automáticamente ukax utjkaniti.
Ukampirus, mä jisk’a k’ariw utji, miembron qalltayirip katxaruñataki: mä extension
ukan qalltayirir uñt’ayaña .
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
Suma qhanañcht’awi estructuras ukanakataki
var
yapunakax nil
ukar uñtatawaextension
ukan mä costumbre ukar uñt’ayañaMä clase ukan nayrïr qalltayiripax uñt'at qalltawiwa . Ukajj pä amtaruw yanaptʼi:
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) } }
Taqi yapunakax janïr super.init
ukar jawskasax phuqhantatäñapawa . Ukax kunatix superclase inicializador ukax subclase ukan jan walt’ayat thakhinak jawsaspawa, ukax jan pobladas subclase propiedades ukar mantaspawa.
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) } }
Ukhamat, jan self.breed = breed
ukar uñt’ayasksna ukhax mä pantjasiw apnaqañ pachan jikxatassna kunatix Animal
inicializador ukax Dog
clase ukanx getInfo()
uka lurawiruw jawsaspa. Aka lurawix breed
propiedad ukar mantañ yant’i, ukax janiw jichhakamax jaqichatäkaspati.
Estructuras ukanakat sipansa, clases ukanakax janiw mä inicializador implícito miembro ukarjam katuqapkiti. Jan qalltatäki uka propiedades ukanakax utjki ukhaxa, mä compilación pantjasiwiw utji:
class Animal { // ❌ Class 'Animal' has no initializers var age: Int }
class Animal { // ✅ var age: Int = 0 }
class Animal { // ✅ var age: Int? }
class Animal { } // ✅
Yatichäwinakax mä conveniencia inicializador ukanirakiwa . Janiw designados inicializadores ukar uñtaskiti, janiw mä objeto zero ukhat lurapkiti jan ukasti yaqha inicializadores ukan lógica ukar wasitat apnaqasaw qalltañ lurawix simplifica.
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 } }
Conveniencia inicializadores ukanakax designados inicializadores jan ukax yaqha conveniencia inicializadores ukanakaruw jawsapxaspa. Qhiparusti, mä designado inicializador ukax sapa kutiw jawsatäni.
Conveniencia qalltirinakax sapa kutiw horizontal (self.init) ukar sarapxi, ukatx designados inicializadores ukanakax verticales (super.init) ukar sarapxi.
Mä subclase ukax machaq propiedades ukanakat yatiyas ukhax taqi superclase ukan conveniencia inicializadores ukanakarux janiw mantañapakiti.
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
Ukax askichasispawa taqi superclase ukan uñt’ayat qalltayirinakar jan yäqasa .
class Dog: Animal { // ... override init(age: Int, name: String) { self.breed = "Mixed" super.init(age: age, name: name) } } let dog = Dog(age: 3) // ✅
Jasakiw uñjañaxa, ukhamatwa, mä conveniencia inicializador jutir subclase ukan apnaqañatakix pä inicializadores ukarux chhaqtayañaw wakisi.
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) // ✅
Ukampirus ukax mä conveniencia override initializer ukampiw jan lurasispa .
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) // ✅
Jichhax sapa subclase ukanx 2 explícitamente especificados inicializadores ukanakakiw utjistu.
Uñakipt’aña kunjams conveniencia override initializers ukax self
designado init sasin sutichapxi super.init
uksat sipansa.
Aka k’arix Swift in Depth 5 t’aqapanx Tjeerd in 't Veen ukan 5 t'aqapanw sum qhanañchasi, uka librox nayatakix wali askiwa.
super.init()
ukaruw jawsaraki.Jiwasax nayraqat arsuwaytanwa, mä subclase ukax machaq parámetros ukar jan uñt’ayañapatakix, ukax automáticamente taqi superclase ukan qalltayirinakap herencia ukham katuqaraki.
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) // ✅
Ukampirus yaqha wakiskir amtawix utjarakiwa: superclase ukax mä inicializador designado ukakiw utji ukatx jan parámetros ( init()
jan argumentos ukampi), ukhamax subclase ukan qhananchata inicializadores ukax janiw super.init()
ukar jawsañax wakiskiti. Ukhamächi ukhaxa, Swift compilador ukax automáticamente jawsañx super.init()
utjki ukaruw jan arsuwinakampix uñt’ayi.
class Base { init() { } } class Subclass: Base { let secondValue: Int init(secondValue: Int) { self.secondValue = secondValue // ✅ without explicit super.init() } }
Uka chimpux apthapitawa kunatix super.init()
ukax implícitamente jawsatawa. Ukax yaqhip uñacht’äwinakatakix wali wakiskiriwa.
Mä required
qalltayirix taqi chiqanw apnaqasi, kawkhantix mä subclase ukax pachpa qalltawimp chikaw base clase ukampix utjañapa. Ukhamaraki super.init()
ukaruw jawsañapa. Aka amparamp qillqt’at uñacht’awinakax kawkhantix mä required
qalltawix wakisi.
Mä genérico tipo ukan init
jawsañax mä required init
uñt'ayasakiw lurasispa.
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 }
Aka codigox janiw compilar kunatix Factory
ukax janiw kuns yatiskiti subclases de Base
ukanakat. Ukhampachasa aka particular tuqinxa, Subclass
ukax mä init()
ukampiw jan parámetros ukampix utji, amuyt’añäni, machaq yapu uñt’ayaspa ukhaxa:
class Subclass: Base { let value: Int init(value: Int) { self.value = value } }
Aka chiqanx, janiw ch’usat init
ukanïxiti, ukhamax kunjamtix required
ukhamarjamaw yatiyatäñapa .
class Base { required init() { } } class Subclass: Base { } struct Factory<T: Base> { static func initInstance() -> T { // ✅ T() } } let subclass = Factory<Subclass>.initInstance()
Qhanacht’añatakix janis Subclass
ukan required init
uñt’ayasktan ukhas compilador ukax jiwasatakiw uñstayi. Uka tuqitxa Compilador ukan yanapt’awipanw aruskipt’asiwayi. Uka required init
ukax automáticamente herencia ukat super.init()
satawa.
class Subclass: Base { required init() { super.init() } }
Taqi inicializadores ukanakaxa protocolos ukanakana qhananchata ukanakaxa required
:
protocol Initable { init() } class InitableObject: Initable { init() { // ❌ Initializer requirement 'init()' can only // be satisfied by a 'required' initializer } // in non-final class 'InitableObject' }
Maysatxa, akax wakisiwa ukhamat compilador ukax subclase ukax protocolo inicializador ukar phuqhañapataki. Kunjamtï yatktanxa, janiw sapa kutix ukhamäkiti —init init
janiw required
, subclase ukax janiw obligat ukhamäkiti ukat inas jupan qalltayirip qhanañchchispa.
class IntValue: InitableObject { let value: Int init(value: Int) { self.value = value } } let InitableType: Initable.Type = IntValue.self let initable: Initable = InitableType.init()
Chiqans, aka chimpux janiw compilatäkaniti kunatix Base.init()
ukax janiw required
.
class InitableObject: Initable { required init() { } // ✅ } class IntValue: InitableObject { let value: Int required init() { self.value = 0 } init(value: Int) { self.value = value } }
Ukham uñtasitaw Self()
qalltayirir jawsañax métodos estáticos ukanx utji.
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 }
Kunjamtix nayrax lurapxirïktxa, uka jan walt’awix herencia tuqitwa:
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) } }
required
: final
Kunjamatixa required
amtawixa mä qalltayiriru phuqhañapatakixa ch’amanchañawa jisk’a clasenakanxa, naturalmente, herencia jark’añaxa final
aru apnaqasa mä qalltayiriru chimpuntañaxa wakisi kunjamatixa required
ukhama .
protocol Initable { init() } final class InitableObject: Initable { } // ✅
protocol ValueInitable { init(value: Int) } final class ValueInitableObject: ValueInitable { init(value: Int) { } // ✅ }
init()
ukampikiwa jan parámetros ukampi, ukax subclase inicializadores ukanx automáticamente jawsatawa.required
qalltayirix wakisiwa, subclases ukan utjatap garantizañataki, genéricos, protocolos ukat Self()
ukanakan apnaqañataki. Mä jisk’a arsuwi UIView()
qalltayiri jan parámetros ukampi, ukax janiw documentación ukan jikxataskiti jan ukasti misterioso taqi chiqanw apnaqasi.
Ukax kunatix UIView
NSObject
ukan herenciapawa , ukax mä init()
jan parámetros ukaniwa. Ukhamarusa , aka qalltawixa janiwa qhananchatakiti UIView
interfaz ukanxa, ukampirusa wali uñt’atawa:
@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()
Ukampirus, capucha manqhanxa, aka qalltirix init(frame:)
ukaruw jawsi kunawsatix código ukan qalltaski ukhax jan ukax init(coder:)
ukaruw jawsi kunawsatix Interface Builder tuqi qalltaski ukhaxa. Ukax lurasi kunatix UIView
ukax NSObject.init()
ukan phuqhawip churaraki, ukax chiqanchasispawa kunatix method_getImplementation
ukax NSObject.init()
ukat UIView.init()
ukatakix kunayman direccionanak kutt’ayaraki.
Mä init failable ukax mä opcional ukar kutt’ayañakiw
final class Failable { let positiveValue: Int init?(value: Int) { guard value > 0 else { return nil } positiveValue = value } }
Enums ukax mä raw valoraniw mä libre init?(rawValue:)
enum Direction: String { case north case west case south case east } let north = Direction(rawValue: "north")
Ukhamaraki enums ukatakix mä init costumbre luraraksnawa. Taqi enum inits ukax self
asignañapawa.
enum DeviceType { case phone case tablet init(screenWidth: Int) { self = screenWidth > 800 ? .tablet : .phone } }
Swift ukanx taqi kunatix inicializadores ukan wakiskir amtanakap uñt’ayawaytanwa:
Mä inicializador ukanx taqi yapunakax phuqhantatäñapawa.
Opcional var
propiedades ukax nil
ukaruw uñt’ayasi.
Estructuras ukax mä inicializador miembro ukan inakiw katuqapxi .
Miembron qalltayiripax chhaqtawayxiwa kunawsatix mä costumbre qalltayirix qhanañchatäki ukhaxa.
Mä uñt’at qalltayirix taqi yapunak phuqhantatañapatakiw uñji ukatx super.init()
ukaruw jawsaraki.
Mä conveniencia inicializador ukax qalltañ simplifica, mä designado inicializador ukar jawsasa.
Conveniencia qalltirinakax sapa kutiw horizontal ( self.init
) sarapxi, ukatx designados inicializadores ukax verticales ( super.init
) ukaruw sarapxi.
Mä conveniencia inicializador ukax subclases ukanakatakix janiw utjxiti, jupanakax machaq propiedades ukanakat yatiyapxi ukhaxa.
Mä superclase ukan conveniencia inicializador ukar kutt’ayañatakix , taqi uñt’at inicializadores ukanakax chhaqtayatäñapawa.
Jakhuwi jisk’achañatakixa, mä conveniencia uñakipaña qalltayirimpiwa apnaqasispa.
Mä subclase ukax machaq parámetros ukar jan uñt’ayañapatakix, ukax automáticamente taqi inicializadores ukanakaruw superclase ukanx herencia ukham katuqaraki.
Superclase ukax init()
ukampikiwa jan parámetros ukampi, ukax automáticamente subclase inicializadores ukan jawsatawa.
Mä wakiskir qalltayirix subclases ukan utjatap uñji, genéricos, protocolos ukat Self()
ukanakan apnaqañataki.
UIView.init()
ukax UIView.init(frame:)
jan ukax UIView.init(coder:)
ukar jawsatawa.
Mä jan walt’ayat qalltawix mä opcional ukar kutt’ayaraki.
Enums ukax mä raw valoraniw mä libre init?(rawValue:)
.
Taqi enum qalltirinakax self
asignapxañapawa.
Aka qillqatanx mä aski yänak jikxatapxañamatakiw suyt’askta. Kunas jan qhankiti jan ukax jan chiqaw sañ munaschi ukhax Telegram ukan inaki qhanañcht’añatakix jawst’apxita: @kfamyn .