Свифт 101 - Рад са Свифт-овим новим опционим вредностима

Свифт програмски језик има нову функцију која се зове опционална и која раније није била доступна у Објецтиве-Ц. Они су слични опционим типовима у Јава и нуллабле типовима у Ц # програмском језику.

Зашто користити опционално?

Можда размишљате: "Могу да игноришем необавезне ставке - то је функција коју никада нећу користити", али препоручујем да даље читате. Открит ћете да морате користити опцију у Свифт-у ако вам је икада потребна вриједност која је нула!

Опционе вредности у Свифт-у вам омогућавају да будете прецизнији у свом коду тако што ћете дозволити да одредите када је у реду да нека одређена вредност буде празна (и када није!) неочекивана вредност нил.

Свифт-ове опционалности такође помажу коду ваше апликације да боље одрази способност коју већ имате у основним подацима да бисте назначили да је атрибут одређеног ентитета опционалан. Као што је приказано на слици 1, можете одредити тип атрибута (Стринг, у овом случају), као и назначити да ли је вриједност опционална.

Слика 1 - Можете да наведете да је атрибут Цоре података ентитета опционалан.

Сада вам Свифт омогућава да урадите исто са вашим особинама и променљивим. Ево еквивалентне опционалне декларације у Свифт-у:

var middleName: String?

Ова декларација креира променљиву названу миддлеНаме типа Стринг . Знак питања ( ? ) Након типа променљиве Стринг указује да променљива миддлеНаме може да садржи вредност која може бити или Стринг или нил . Свако ко гледа овај код одмах зна да средњи назив може бити нил . То је само-документовање!

Ако не наведете почетну вредност за опционалну константу или варијаблу (као што је приказано горе), вредност ће се аутоматски поставити на нулу . Ако желите, можете експлицитно поставити почетну вредност на нил:

var middleName: String? = nil

Сада ћемо погледати ближе како се у Свифт-у користи нил .

нил ин Свифт

На први поглед то можда није очигледно, али само опциони могу бити нули . Као што је наведено у књизи Аппле Свифт Программинг Лангуаге (доступна је бесплатно у иБоокс Сторе-у):

нил се не може користити са необавезним константама и варијаблама. Ако константа или варијабла у вашем коду треба да буде у стању да се носи са одсуством вредности под одређеним условима, увек је декларишите као опциону вредност одговарајућег типа.

То значи да не можете да урадите нешто овако, јер променљива фирстНаме није означена упитником да би означила да је опционална:

var firstName: String = nil

Овај код производи следећу грешку за време компајлирања:

Тип 'Стринг' не одговара протоколу 'НилЛитералЦонвертибле' .

Такође је важно напоменути да је нула у Свифт-у другачија од нула у Објецтиве-Ц. У Објецтиве-Ц, нил је показивач на непостојећи објекат. У Свифт-у, нил једноставно указује на одсуство вредности - није показивач. То значи да можете специфицирати опцију било ког типа, а не само типове објеката.

Приступање опционим вредностима

За разлику од других програмских језика, у Свифт-у не можете директно да приступите опционој вредности . Неопходно прво да размотате опцију да бисте приступили њеној основној вредности. Узмите за пример следећи код:

вар фирстНаме: Стринг = "Риан"

вар миддлеНаме: Стринг? = "Мицхаел"

вар фирстАндМиддлеНамес: Стринг

фирстАндМиддлеНамес = фирстНаме + "+ миддлеНаме

Прве три линије кода декларирају променљиву фирстНаме Стринг, променљиву Стринг варијабла миддлеНаме и променљиву стринг СтрингАндМиддлеНамес . Следећа линија кода повезује (спаја) вредности варијабле фирстНаме и миддлеНаме заједно са размаком између њих. Можда ћете се изненадити када откријете да ова линија кода генерише следећу грешку у времену компајлирања:

Вредност типа опције "Стринг?" нот унвраппед; да ли сте намеравали да користите '!' или '?'?

Ово је један од Свифтових механизама заштите. То вас приморава да потврдите да вредност може бити нула . Дакле, како да размотате необавезно? Постоје два главна начина описана у следећим одељцима.

Коришћење принудног отварања за опционалне производе

Као што је сугерисала грешка компајлера у претходном одељку, један од начина за размотавање необавезне вредности је употреба узвичног знака (!) Иза опционалног да га експлицитно размотате. На пример:

firstAndMiddleNames = firstName + " " + middleName!

Ово ручно приморава вредност средњег имена опционо да се отпакује. Међутим, ако миддлеНаме садржи нил у време извођења, то ће произвести ЕКСЦ_БАД_ИНСТРУЦТИОН грешку времена извођења . Дакле, очигледно не бисте желели да користите присилно одмотавање, осим ако сте апсолутно сигурни да вредност није нула .

Коришћење опционог везивања за откључавање опција

Можете користити технику познату као опционо везивање да бисте тестирали да ли опционално садржи вредност, и ако је тако, ту вредност ускладиштите у привремену променљиву или константу. Да бисте показали како ово функционише са нашим претходним примером, погледајте овај код:

var firstName: String = "Ryan"

вар миддлеНаме: Стринг? = "Мицхаел"

вар фирстАндМиддлеНамес: Стринг

ако пусти средњи = средњи назив

{

фирстАндМиддлеНамес = фирстНаме + "+ миддле

}

друго

{

фирстАндМиддлеНамес = фирстНаме

}

Када се услов иф провери у време извођења, ако променљива миддлеНаме садржи вредност Стринг, услов се процењује на труе, вредност садржана у варијабли миддлеНаме је отпакована, ускладиштена у средњој константи и код у коврџавим заградама иф израза се извршава.

Ако променљива миддлеНаме садржи нил, услов се процењује на фалсе, необавезна вредност се не отпакује, а извршава се код у витичастим заградама наредбе елсе .

Имплицитно неупарени опционални

Свифт такође има нешто што се назива имплицитно неупареним опцијама. Ово су опционалне ставке које не морају да се отпакују коришћењем или присилног одматања (!) Или опционог везивања, зато што су имплицитно размотане (аутоматски). Проглашавају се уз помоћ ускличника (!), А не упитника (?).

Често видите имплицитно необрађене опционе када радите са излазима Интерфаце Буилдера (својства ИБОутлет ). На пример:

@IBOutlet weak var lblDescription: UILabel!

У овом коду, својство излаза лблДесцриптион има знак узвика иза њега, указујући да је имплицитно одмотан. Ово вам омогућава да приступите објекту без да га распакујете.

У овом примеру, својство излаза није загарантовано да садржи референцу на ознаку, али то апсолутно треба . Ако не садржи референцу на ознаку, то значи да је веза између утичнице и етикете прекинута. У том случају, у реду је да имате грешку у времену извршавања јер желите да знате да је веза прекинута тако да је можете поправити!

Очигледно, у случајевима када нисте 100% сигурни да константа или променљива садржи вредност, требало би да користите обичну опцију уместо тога.

Закључак

Оптионалс су одлична нова значајка Свифт-а која вам омогућава да безбедно рукујете нил вредностима у вашим иОС апликацијама. Препоручујем да прегледате овај пост неколико пута како бисте били сигурни да разумете основне концепте, а затим се вратите на Апплеову књигу језика Свифт Программинг Лангуаге да бисте сазнали више о томе како се опционални производи користе у Свифт-у.