Страх се полако убацио кад сам схватио да почињем да ми понестаје ових фотки

Свифт + иницијализација са затварајима

Цлосурес Ф.Т.В.

Кратка белешка - сви моји будући постови биће објављени на мојој наменској веб локацији и ова публикација се више не ажурира. Хвала за читање!

Почињем да ископавам читав плес иницијализације у Свифту. Писао сам о томе. Писао сам о томе зашто то уопште функционише. Разговарао сам о томе. Читао сам о томе (пуно). Али хеј, враћам се на још један чин по том питању.

Од многих, лепих и различитих начина на којима Свифт може иницирати нешто - употреба затварача се обично не доводи као метода којом се то постиже. Али, нажалост, то може да учини котловницу ™ инит () кодом много болнијим и мало управљивијим.

За програмере програмског корисничког сучеља вани - ове за вас !

УИКит == УИХугеСетупЦоде ()

Види, није УИКитс крив. Компоненте са којима корисник треба да комуницира предају се планини инсталационог кода, јер преференције. Обично се много тога нађе или у виевДидЛоад или лоадВиев:

оверриде фунц лоадВиев ()
{
    нека хеллоВорлдЛбл = УИЛабел ()
    хеллоВорлдЛбл.тект = НСЛоцализедСтринг ("цонтроллер.топЛбл.хеллоВорлд", коментар: "Поздрав свет!")
    хеллоВорлдЛбл.фонт = УИФонт.преферредФонтФорТектСтиле (УИФонтТектСтилеБоди)
    хеллоВорлдЛбл.тектЦолор = УИЦолор.вхитеЦолор ()
    хеллоВорлдЛбл.тектАлигнмент = .Центер
    селф.виев.аддСубвиев (хеллоВорлдЛбл)
}

Ово је прилично стандардно за оне од нас који упијају воде Цоцоа Тоуцх без .киб или .сторибоард-а. Мада, ако делите моју љубав према незнатним методама виевДидЛоад или лоадВиев, можете то одложити на друго место.

Реците, својство:

нека хеллоВорлдЛбл: УИЛабел = {
    нека је лбл = УИЛабел ()
    лбл.тект = НСЛоцализедСтринг ("цонтроллер.топЛбл.хеллоВорлд", коментар: "Здраво свет!")
    лбл.фонт = УИФонт.преферредФонтФорТектСтиле (УИФонтТектСтилеБоди)
    лбл.тектЦолор = УИЦолор.вхитеЦолор ()
    лбл.тектАлигнмент = .Центер
    поврат лбл
} ()

Прилично. У Апплеовој књизи о Свифт-у напомиње да „ако је подразумевана вредност вашег ентитета потребна нека прилагођавање или подешавање, можете да користите затварање или глобалну функцију да бисте обезбедили прилагођену подразумевану вредност за тај објекат.“ Као што смо већ поменули, УИКит контрола доноси пуно прилагођавања и подешавања.

Један од прилично лепих нуспродуката је, како лоадВиев сада изгледа:

оверриде функц лоадВиев
{
    селф.виев.аддСубвиев (селф.хеллоВорлдЛбл)
}

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

У овом случају то је .

Правила су правила

Иако имамо сјајну нову играчку, неопходно је упамтити правила земље. Пошто доделимо својство затварању, остатак инстанце која садржи садржи се можда још није покренут. Због тога, када се затварање изврши - није могуће референцирати друге вредности својства или себе изнутра.

На пример:

нека хеллоВорлдЛбл: УИЛабел = {
    нека је лбл = УИЛабел ()
    лбл.тект = селф.сомеФунцтионТоДетерминеТект () // Грешка компајлера
    лбл.фонт = УИФонт.преферредФонтФорТектСтиле (УИФонтТектСтилеБоди)
    лбл.тектЦолор = селф.миАппТхеме.тектЦолор () // Још једна грешка
    лбл.тектАлигнмент = .Центер
    поврат лбл
} ()

Примера себства још увек није безбедна за употребу или можда неће проћи са двофазним процесом иницијализације Свифта. Исто важи и за било која својства инстанци, која се могу доделити или иницијализирати пошто се затварање одмах извршава.

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

Слатко са колекцијама

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

Размотрите следећи пример, преузет из иницијализатора у пројекту на којем тренутно радим. Класа која садржи овај код има својство [Девелопер]. На новом покретању поставио сам своје почетне вредности из .плист датотеке. Након тога се чувају преко НСКеиедАрцхивер.

чувај нека девс = НСКеиедУнарцхивер.унарцхивеОбјецтВитхФиле (ДевДатаМанагер.АрцхивеУРЛ.патх!) као? [Програмер] остало
{
    селф.девелоперс = {
        нека пЛистДата = // Дохвати податке о списку
        вар девАрраи: [Девелопер] = [Девелопер] ()
        // Постављање девАрраи из плист података
        ретурн девАрраи.мап {$ 0.сетЛоцатион ()}
                       .филтер {$ 0.исРентабле}
                       .сорт {$ 0.наме <$ 1.наме}
     } ()
    повратак
}
селф.девелоперс = девс

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

Како постају повишење иницијала и поништавања виевДидЛоад, овакве секције ствари (у најмању руку) су добродошли поклон у смислу читљивости.

Добијање НСЦуте

Ако стварно копате иницијализирајуће ствари са затварањем, али трпите због озбиљног недостатка употребе тих функционалних $ у вашем коду, разведрите се. Користећи неки спретни Свифтери, може се написати неки код који закључује тип унутар самог затварања, што даје одређену конфигурацију професионалног стила. Размотрите овај код на који сам прво наишао на увек информативном НСХипстеру:

@варн_унусед_ресулт
публиц фунц Инит <Типе> (вредност: Тип, блок @ноесцапе: (објект: Тип) -> Воид) -> Тип
{
    блок (објект: вредност)
    повратна вредност
}

Свиђа ми се куда ово иде. Јавна функција која затвара типкани објект користећи генеричке податке, који затим враћа тај тип. То значи да можете окренути и иницијализирати ствари са више информација о типу. Наш први узорак кода би тада изгледао овако:

нека хеллоВорлдЛбл = Инит (УИЛабел ()) {
    $ 0.тект = НСЛоцализедСтринг ("цонтроллер.топЛбл.хеллоВорлд", коментар: "Здраво свет!")
    $ 0.фонт = УИФонт.преферредФонтФорТектСтиле (УИФонтТектСтилеБоди)
    $ 0.тектЦолор = УИЦолор.вхитеЦолор ()
    $ 0.тектАлигнмент = .Центер
}

Иако се можда чини, то заиста умањује потребу за променљивом примерком из затварања и ослобађа се захтева „()“. Веома лепо .

Последње мисли

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

То је забаван начин да се ствари заврше, а чак је и неколико начина да се иста ствар уради у нашем старом пријатељу Објецтиве-Ц. Али хеј, што више знаш, амирите?

До следеће недеље = {нека недеља = недеља () недеља.адванцедБи (дана: 7)} ()

Јордан Морган је софтверски инжењер за иОС који води Дреаминг Ин Бинари

Ако сте научили о коришћењу затварача за иницијализаторе, слободно наставите и НСРецомменд (ово где је доле);