Lazy var vs let

Noriu naudoti „Lazy“ kai kurioms „Swift“ savybėms. Mano dabartinis kodas atrodo taip:

 lazy var fontSize : CGFloat = { if (someCase) { return CGFloat(30) } else { return CGFloat(17) } }() 

Faktas yra tai, kad įdiegus fontSize, jis niekada nekeis. Taigi norėjau tai padaryti:

 lazy let fontSize : CGFloat = { if (someCase) { return CGFloat(30) } else { return CGFloat(17) } }() 

Tai neįmanoma.

Tik tai veikia:

 let fontSize : CGFloat = { if (someCase) { return CGFloat(30) } else { return CGFloat(17) } }() 

Taigi - noriu turto, kuris bus laisvai pakrautas, bet niekada nepasikeis. Kas yra teisingas būdas tai padaryti? naudojant let ir pamiršti apie tingus init? Arba turėčiau naudoti lazy var ir pamiršti apie nuolatinį turtą?

31
11 янв. nustatė YogevSitton 11 sausis 2015-01-11 13:24 '15 at 13:24 2015-01-11 13:24
@ 3 atsakymai

Tai yra paskutinis Raštas Xcode 6.3 Beta / Swift 1.2 leidiniuose :

konstantos buvo apibendrintos, kad daugiau nereikėtų nedelsiant inicijuoti. Nauja taisyklė yra ta, kad tuščia konstanta turi būti inicijuota prieš naudojimą (pvz., Var) ir kad ją galima inicijuoti tik inicijuojant arba nepakeitus.

Tai leidžia naudoti tokius šablonus kaip:

 let x: SomeThing if condition { x = foo() } else { x = bar() } use(x) 

kuri anksčiau reikalavo naudoti var, nors mutacijų nėra. (16181314)

Akivaizdu, kad jūs nesate vienintelis, nusivylęs tuo.

20
11 февр. Chris Conover atsakymas, pateiktas vasario 11 d 2015-02-11 03:46 '15 at 3:46 2015-02-11 03:46

Greita knyga turi tokią pastabą :

Jūs visada turite paskelbti tingią nuosavybę kaip kintamąjį (su var raktiniu žodžiu), nes jo pradinė vertė negali būti gauta prieš inicijuojant egzempliorių. Nuolatinės savybės visada turi turėti vertę, kol inicijavimas bus baigtas ir todėl negali būti paskelbtas tingus.

Tai prasminga kalbų diegimo kontekste, nes visos pastovios saugomos savybės apskaičiuojamos prieš pradedant objektą. Tai nereiškia, kad leidimo semantika galėtų būti pakeista, kai ji naudojama su lazy , bet ji nebuvo įgyvendinta, todėl var tik išlieka vienintelė galimybė su juo šiame etape.

Dėl dviejų pateiktų variantų aš nuspręstų tarp jų dėl veiksmingumo:

  • Jei turto vertė retai pasiekiama, ir tai yra brangu jį iš anksto apskaičiuoti, naudoju var lazy
  • Jei vertė yra didesnė nei 20,30% atvejų, arba tai yra gana nebrangi apskaičiuoti, aš naudoju let

Pastaba Toliau optimizuosiu jūsų kodą, kad CGFloat sąlyginę išraišką į CGFloat :

 let fontSize : CGFloat = CGFloat(someCase ? 30 : 17) 
16
11 янв. atsakymas dasblinkenlight 11 sausis 2015-01-11 13:37 '15, 13:37, 2015-01-11 13:37

Kaip rodo dasblinkenlight, tingūs savybės visada turėtų būti deklaruojami kaip kintamieji „Swift“. Vis dėlto galite nuskaityti tik turinį, kad jį būtų galima mutuoti tik iš šaltinio failo, kuriame buvo apibrėžtas subjektas. Tai yra artimiausias kelias, kurį galiu apibrėžti, kad apibrėžčiau „tingų leisti“.

 private(set) lazy var fontSize: CGFloat = { if someCase { return 30 } else { return 17 } }() 
4
17 янв. atsakymas pateikiamas sdduursma 17 jan. 2016-01-17 02:04 '16 at 2:04 2016-01-17 02:04

Kiti klausimai apie žymes arba Užduoti klausimą