>> [За възпроизвеждане на музика]
>> DAN AMRMENDARIZ: Всеки, добре дошли в семинара CS50,
IOS App развитие с Swift.
Аз съм Дан Armendariz, и аз съм учител на компютърните науки тук в Харвард.
>> И следващия час ще бъде вихрушка обиколка на толкова неща
по тази тема, тъй като ние може да се побере.
Аз ще публикуваме всички изходния код че вие ​​ще видите днес онлайн.
Ние може да не бъде в състояние да всъщност разясни всичко
че аз съм, че аз съм ви показва в този час.
Но поне се надяваме чрез коментарите на изходния код,
вие ще бъдете в състояние да се опитам да разбера какво точно се случва за тези неща
че ние съвсем не стигнем до.
>> Като цяло структурата на днешната беседа ще бъде както следва.
Ще започнем от това някои основни синтаксис с езика Swift,
навлиза в някои от по-напредналите синтаксис на Swift език.
Защото езикът е наистина модерен и тя
има много високо ниво функции, неща, които не сме
вижда в C през цялата CS50, или дори някои другите езици
че сме започнали използвате в CS50 като PHP,
така че аз отивам да трябва да се опитаме да въведат и някои теми, които
са свързани с по-високи нива езици че не може да видите в дълбочина в CS50,
но вие ще видите по-късно в компютърни науки класове.
Така че това ще бъде плътно опаковани час.
И моля не се колебайте да ме пусне знам, ако имате някакви въпроси.
Така че, ако проявявате интерес при това развитие
с Swift, или наистина всяко развитие IOS ап,
има няколко изисквания.
На първо място, трябва да бъде с помощта на на Mac, работещ в примерите
че ние ще използваме и днес, сравнително нова версия на OS
X. В този случай, Бягам X 10.5.
Можете да се работи 10.11 ако искате.
Но всичко, което ти започваш да се виж се с участието на Xcode 7 и по-късно,
който има най-новата версия на Суифт, която е Swift 2.0.
Това всъщност е доста важна разлика.
Много от синтаксиса има променила доста значително
в някои случаи от Swift 1.0, който бе представен миналата година,
да Swift 2.0, което просто излезе тази есен.
Така че ние ще покажем Swift 2.0.
Много от нещата, които можете да потърсите онлайн
когато се опитвате да получите допълнителна информация за различни неща,
Вие може да искате да се изрично търси за Swift 2
а не просто стар Swift да направи уверите, че получавате синтаксиса вярна.
>> В действителност, това обикновено е вярно.
Има една бърза количество развитие случва в Swift език
откакто Apple го пусна, мисля, какво, това е било малко повече от година
сега.
И нещата са се променили драматично през това време.
И така не бъде осуетено ако, когато търсите около
за теми за Swift или как да постигнете нещо, с помощта на някои примерен код
или нещо, че не действително работят върху Swift 2.0.
Уверете се, че търсите специално за тази версия
да се опита да сведе до минимум влиянието на различните версии и тези различни неща.
>> Ще се опитам да посоча само някои неща, които са различни от по-старите версии.
Но това е нещо, което да внимавате.
Това е най-вероятно ще бъде една от най-големите главоболия
че вие ​​ще имате с Swift е намирането Например код, който е по-стар, дори само
от няколко месеца, се опитва да използва то във вашата по-модерен проект.
И тя просто не работи.
Ставаш грешки съставител, синтаксис грешки, всякакви луди неща.
Така че просто бъдете търпеливи че и вие ще се надяваме
имаме доста приятно изживяване с Swift цяло.
>> Сега можете действително join-- и се надявам, ние всъщност все още имат този този year--
CS 50 на Apple ап развитие на екипа, който
ще ви позволи да инсталирате приложения които създавате на вашите IOS устройства.
Така че да разгледаме този URL, ако ви интересува да направим това.
>> Така само за няколко неща за себе си Swift.
Това е компилиран език.
Но вие ще видите, че някои от функциите, които ние използваме
Оставете го да се използва също и в малко по- като тълкува така, както добре.
>> Много от синтаксиса е заимстван от C. Той е базиран и написан на C.
И така, ние ще видим, че има много на храна за вкъщи
от съществуващия си знания от C, че можем порт за Swift.
>> Но има неща, които да го направи много по-различна от C.
Тя е много силно написали.
Има автоматично управление на паметта.
Ти няма да се наложи да използвате изчистване или безплатно навсякъде.
Той е проектиран за всеобщност.
Така че, с други думи, можете да го използвате в всички видове контексти, от Apple Watch
да iPhone по целия път до OS X, и дори някои сървъри, дори някои скриптове.
Но ще видим, че подкрепа за скриптове
не е съвсем там, все още като тя е и на други езици.
Така че най-вероятно ще бъде с помощта на този изключително за развитие
на вашия Mac или вашия iPhone.
>> И това има много съвременни функции.
И много от тези неща са неща, които ние ще се опитаме да се справи и днес,
но също така и нашите теми, които честно казано, можем да посвети цялото курсове.
В действителност, CS 51, което е предложена следващия семестър,
фокусира много по тези теми които са описани по-долу.
Така че можете да прекарате целия семестър разбирането на тези неща.
Но ние ще се опитаме за да получите чрез тях
най-малко достатъчно, че сте може да разбере какво е
случва, когато търсите при Swift програма
и да бъде в състояние да проникна си път през него на окончателен проект.
>> Сега един от най-добрите начини, които можете да получите допълнителна информация по този
е казано просто чрез Apple, при условие документация за Swift.
Има много неща, на APIs които са на разположение.
И това е добра начална точка за вас да се търсят специфични неща, които ви
искам да правя с API, включваща IOS.
Ако искате да работите с камерата Например, можете да започнете да търсите тук,
и също така да използвате Google и Stack Overflow както обикновено.
>> Всякакви въпроси за тази преди да скочи право?
Всичко е наред.
Нека да продължим.
>> Така че на първо място, аз имам брой примерни файлове.
И аз ще се опитам да се оттегли чрез тях относително бързо.
Това е Hello World файл за Swift.
Това е много проста.
Има начин още коментари отколкото са действително код.
Забележете действителният код е най- на самото дъно на линия 14.
Той казва печат.
И след това е извикване на функция.
Ние сме преминаване в нея на низ, наречен Hello cs50.
Забележете, че няма точка и запетая.
Забележете, че няма инт главната.
Има никой от cruft че имахме с C.
Когато ние сме с помощта Swift по този начин, който е просто написани на текстов файл
и се съхраняват на компютъра ми, а след това Мога да го компилирате и да го ползвате.
>> Забележете, че тук съм не използвате CS50 IDE.
Това предполага, че аз съм използвате, и че аз съм на OS X,
и че съм Xcode вече е инсталиран на тази машина, за да може това
да всъщност функция.
Но това е само един нормален текстов файл че тогава можем да съставят и редактиране.
Така че нека да видим как това всъщност работи.
Ами ако искам да го компилирам?
swiftc 1.swift.
След миг-два, то ще видите, че ние имаме сега
съставила това в един файл, наречен 1.
И сега ние сме отпечатан нашата CS50, нашата Hello World заявление скоро.
>> Забележете още нещо като добре е, че по подразбиране,
ние не трябва да вход а / п, за да отпечатате нов ред.
По подразбиране, функцията за печат в Swift ще отпечата нова линия за вас.
Можете да мине незадължителен допълнителен параметър, за да го кажа, да не го правят.
Но Google за повече информация по този въпрос.
По подразбиране, че ще направи линията печат.
>> Добре, така че нека да преминем тогава към някои други неща.
И така, как всъщност можем да дефинирате променливи?
Ние можем да направим това е като се използва един от двата метода.
И този, който аз искам да ви кажа, за първи път е това определение нека.
И това е важно защото ефективно
това, което правим, е определяне на постоянна.
Ние ще създадем променлива, или по-скоро постоянно нарече,
предостави, за да го някои data-- в този случай, низа Дан.
Но с помощта на тази нека ключова дума, ние казваме
че това variable-- или отново constant-- нарича
име никога няма да се промени.
Това ще бъде неизменна през целия продължителността на тази програма
или по време на продължителност на контекста
че тази променлива е на разположение.
>> Това е наистина важно, че когато Имате ли някаква информация, която не е
няма да се промени в програмата си, и ще видите различни примери
за това, кога искаме да използваме нека спрямо друга синтаксис,
това е важно, че вие ​​ползване нека когато това е възможно, тъй като тази уведоми
езика, че е Няма да бъде променено,
и действително може да изпълнява много оптимизации
за подобряване на скоростта и безопасността на вашата програма.
И с безопасността, не мога да кажа, нека тя катастрофа с луди грешки
за да бъдем свикнали да виждаме в C.
>> Тогава можем да използваме низ интерполация за капсулиране на това в рамките на една струна.
Така че ние можем да видим в тази принт линия, отпечатате здравей,
и след това да се използва обратно наклонена черта отворени parens, и след това името на променливата ми,
В този случай константа, затворете скобите.
Аз съм същество след пускането на съдържанието на тази променлива, наречена на името
вътрешността на низа и след това отпечатване резултатът там.
>> Има една друга промяна към файла което е, че имам, на самия връх,
пробва вертеп линия, която основно само уточнява,
че искам да използвате Swift преводач, който
означава, че аз вече не трябва да събиране на тази конкретна програма.
Аз просто да го стартирате като свой собствен скрипт.
Но това е, в този случай, зад кулисите се компилират и след това
той да работи.
Това е просто невидима за нас.
>> Добре, така че нека да продължим.
Така че там е малко на измама че просто се е случило преди това.
Аз ви показах, че съм би могъл да определи постоянна.
И аз може да предостави някои данни, за да го направя.
Но в този случай, забележите, че не го направих всъщност определя вида на данните
че е.
И това е така, защото компилатор, Swift може
заключим, вида на данните, само въз основа на данните, които сложих в нея.
Защото знае, че чрез оценка на това променлива точно тук, на това право на данни
тук, той знае, че тя е низ.
И така, тази постоянна име следователно е ще бъде низ, както добре.
>> Но ние също така може да бъде изрично за вида, който е
ние ще се използват за константи или променливи
с помощта на този синтаксис instead-- нека името на дебелото черво String равнява
Дан, който в този случай означава, че ние сме ще определи постоянна нарече.
Това ще бъде от тип String.
И стойността ще бъде Дан.
Сега по друг начин, че ние можем да създадем variables--
и това са непостоянен променливи, които означава, че ние сме в действителност, ще
да променят съдържанието им по някое време в продължителността на контекста
че тази променлива се defined-- ние използвате Var ключова дума вместо нека.
Но отново, по подразбиране, освен ако не знаете че трябва да се манипулира, че данните,
се опитват да използват нека за подобрения в производителността.
>> В този случай, аз мога след това определя вида на данните
че ние очакваме да бъде вътре в тази нова променлива, наречена етикет.
Това ще бъде низ.
И ние ще се тогава свързвам две струни заедно, низа здравей,
и низа, представлявана от променлива, или по-скоро постоянно име.
>> Така че това е хубаво, защото това е малко PHP като това, че ние
имат много лесно съединяване на низове.
Ние не трябва да автоматично използвате всякакъв вид на управление на паметта
за увеличаване на размера и правим всякакъв вид на забавни неща там.
Това работи, тъй като ние всъщност ще очакваме.
>> Добре, всички въпроси за тази?
>> Сега друга причина, че имаме нужда имате възможност
за да може да се определи какво Тип на променливи данни са
е така, защото понякога ние не правим Искам да се инициализира променлива
с някои данни в точка на дефиниция.
Така че в този случай, да речем, че искам да започна въвеждане
някои класове в един клас книга.
Ами аз знам, че един от променливи, които искам да бъда
ще бъде непостоянен клас.
И ние също знаем, че сме искам тя да бъде цяло число.
Но може би все още не правим имат тази степен на разположение.
>> В Swift, което трябва да определи вида на данните
който е свързан с променлива или постоянна нека
Преди да можете да всъщност използвате тази променлива.
Тъй като това е силно написали, което трябва да се сдружават тип
с тези променливи.
>> Така че в този случай, ако аз не бях правилно инициализира първата с някаква стойност,
тогава аз трябва да кажа какво Swift Очаквам типа на данните, за да бъде.
И то се случва да остане че същия тип данни
в цялата история на тази програма.
>> Сега може да се изкушите, веднага след като Аз създадох този клас променлива
и го прави при условие, число от 100, сега, ако аз
Искам да опитам да свързвам низ с това число,
може да се изкуши да продължават да използват този оператор на съединяване на низове
както направихме само няколко реда преди.
Но за съжаление, това всъщност няма да
работи, защото вие сте същество, изпълняващо
операция на два различни вида.
>> Сега това е много по-различен от другите езици като PHP, които са наистина
loosey настръхнал с техния вид видове.
Те просто искали, да, каквото и да, не ми пука.
Само ми дай един вид, и може би ще направи правилното нещо.
>> В този случай, Swift е изключително стриктно за видовете
които се занимават с теб.
Този оператор сумиране или конкатенация оператор
същество има няколко различни възможни варианти.
Можете да направите обобщение с цели числа, или сте
може да направи съединяване на низове, и може би някои други неща, както добре.
Но ако този оператор не признава което е от двете страни на това,
или а комбинацията от тези, два вида, не е това, което е очаквал,
След това ще доведе до провал.
>> Така че в този случай, какво означава това да има низ плюс цяло число?
Ами в контекста на това, ние вероятно ще пожелаете
да се направи операция за съединяване на низове.
Но, разбира се на компютъра не разполага с такива контекст.
И така, ние трябва да се осигури допълнителна информация
да се остави да знам какво е е, че искаме да направим.
>> С други думи, фактът че Swift е силно въведен
означава, че трябва да се направи малко допълнителна работа
за да го да експлоатира начин, който бихте искали.
Но тъй като в резултат на това е по-безопасно.
И след като имате вземе се вземат предвид тези видове,
нещата просто откровено започват да работи доста добре.
>> Така че в този случай, ние след това ще извършва съединяване на низове
като изрично леене цялото число в низ
чрез обвиване в тази капитал S String функция,
и след това с помощта на съединяване на низове оператор да модифицираме променлива етикет,
и след това да го отпечатате.
>> Дотук добре?
Добре, нека да преминем нататък.
>> Сега има голямо разнообразие на данни видове, които можем да използваме в Swift.
Както сте свикнали, ние можем да създадем непостоянен масив.
И това само може масив съдържа само един вид.
>> Така че в този случай, ние ще създадем непостоянен масиви от числа, които
ние ще се обадя класове, а ние ще бъдем в състояние да съхранява, че в този площад скоба
формат като сте свикнал в различни други езици.
Но забележете, че тук сме дефиниране на няколко неща.
класове е непостоянен variable-- ние не използваме нека ключова дума.
Това значи, че тогава можем да модифицирате Съдържанието на този масив.
Тя е от тип Int Array, и ние можем да кажем, че
въз основа на тези квадратни скоби тук.
>> Сега един от най-хубавите неща за това е, че
имат достъп до много Допълнителна информация
около масива само с помощта някои прости нотацията с точка.
Така например, grades.count предвижда да ни
броя на елементите, които съществуват в тази масив, който след това ние можем да получите достъп до доста
лесно просто да се използват, че нотацията с точка.
>> Ако искате да добавите допълнителна елементи на този масив,
не можеш да направиш стила PHP където можете просто да определя изрично,
в даден индекс, някои стойност който искате да вмъкнете.
Вместо това, използвайте атрибута Метод от тип масив
да прилага този артикул, 95, към този списък.
>> Така че сега този масив има следното contents-- 100, 0, 90, 85.
И сега ние сме приложена 95 и това.
>> Има и други начини можем да добавим неща.
Всъщност можете да използвате оператор на сумиране,
които ще се тълкува като операция масив прикрепя.
А след това можете да добавите друг масив, чието съдържание са 70 и 80,
на този масив.
Така че сега ние имаме съдържанието в тази променлива
grades-- 100, 0, 90, 85, 95, 70 и 80.
Това е само една хубава малка синтактична захар, която Swift осигурява за нас.
>> Така че, ако искаме да обобщим на класове, ние сме може би
ще искате да превъртите над всеки елемент в този цикъл.
И ние нямаме, в Swift, понятието на линия за, както бихте очаквали.
Но начина, по който посочва диапазон е малко по-различен.
Така че в този случай, за да обобщим всичко, ние ще
ще създаде временна променлива, наречена сума, за да можем
да се запази този брой.
>> И забележи ни за контур строителство тук.
За индекс в 0 .. <grade.count.
Така че тази конструкция, 0 .. <grades.count е операция гама къде сме
казвайки, че ние ще създадем набор от числа от 0 до
да, но с изключение grades.count.
Така че това ще бъде 0, 1, 2, 3, 4, 5, докато мнозина обаче един
преди grades.count.
>> Така че това е по-различно от това как ние обикновено ще използва за вериги
където ще има някакъв индекс променлива, тя равно на 0 определя на първо място,
и след това да се интегрират, че до известна стойност по-малко от количеството на елементите
че в масив.
>> Така че там е модификация на това, всъщност,
което ни позволява да много лесно зададете различни видове вериги.
Ако промените този диапазон, за да три точки, 0 ... grade.count,
това представлява обхвата 0 да grades.count инклузив,
което означава, че този номер е също След това са включени в този диапазон.
>> Но това е много удобен за тези точните неща,
когато трябва да се извърши повторения над линия
защото тези индекси са нула индексирани, както видяхме и на други езици
както добре.
Всякакви въпроси за тази за цикъл?
>> Така че има косвена дефиниция на този индекс променлива,
чиято стойност започва при 0, и продължава на всеки цикъл на итерация
да се увеличи с 1, докато една точка която е равна на grades.count,
в този момент, цикълът абортира.
>> Забележете, че в нашия низ интерполация тук,
всъщност ние може да изпълнява някои прости манипулации на тези ценности.
Така индекс плюс 1 действително ще извърши сумиране на тази стойност
защото е индекс, в този случай, цяло число.
И в този момент, тя ще след това се превръща в низ
и интерполира в този низ тук, и отпечатва както бихме очаквали. ,
>> И хубавото около масивите тук е
че ние също са в състояние да имат Извличат се стойности и определяне на стойностите
използване на квадратен скоба нотация като сме виждали на други езици, както добре.
>> Добре, така че от тук, ние сега изчисли нашия сбор от всички наши класове.
Сега нещо на следващия логична стъпка би била
да се направи операция по разделяне, за да намерите от средната стойност на тези класове.
Но нещо важно тук се случва, което
е, че тази сума може би е цяло число.
Но ние трябва да изпълнява някои сортиране на двойното деление.
И това ще бъде изключително важно, когато
ние искаме да изпълните тази операция, защото това, което казваме
е, че ние трябва да всъщност извършва разделяне на две двойки.
И отново, защото Swift е много силно написали,
ние трябва изрично да зададете всички от пратки на двойки, преди да можем действително
изпълнява тази операция.
>> Така че, за да можем да изпълнява двойна разделение,
това не е достатъчно само за една на тези елементи, за да бъде двойно.
Двете от тях трябва да бъде двойно, за да може бързо
за да сте сигурни, че това е това, което искаме да направим.
Така че ние ще изрично typecast сумата, която сме изчислена по-горе
и броят на степените на двойки, и След извършване на тази операция и магазин
че в тази нова променлива, или по-скоро тази нова постоянна нарича средна,
което ще има какъв тип, можете да си представите?
Двойна, да.
Така че в този случай, ние не е нужно да я укажете
защото може да се изведе от операция какъв тип средно данни
ще бъде.
И Swift обикновено е доста добър за да може да се направи извод, видовете.
>> Искате ли да видите това тичам, или мога да продължиш напред?
Искам да продължава напред.
Всякакви въпроси относно някой от това?
Страхотен.
>> Сега ние ще започнем да стигнем до добрите stuff-- функциите, определящи
и няколко други видове, които са уникални за Swift, че не трябва
виждал и на други езици до този момент,
но те се намират в друга езици, които може да намерите по-късно.
Така че първото, ако искате за определяне на функция,
можете да го определите с фънки дума функция, и след това името на функцията,
и след това в скоби, аргументите който искате тази функция, за да приеме.
Аргументите трябва също specify-- generally--
трябва също така да се определи видът на данните, които те са, освен ако не може да се заключи.
И ние ще видим, че малко по- протест в съвсем малко.
>> Така че в този случай имаме функция, наречена printGradeCount.
Отиваме да приеме variable-- или по-скоро в този случай,
а constant-- нарича gradebook.
И това ще бъде на Типове масив от цели числа.
Сега има нещо това е наистина важно тук
че аз искам да разбереш.
Това е, че по подразбиране, тези аргументи които са входове към тази функция са
определено с имплицитен нека дума, което означава, че не мога да променя това
gradebook променлива тук.
И това нещо има смисъл, защото сте преминаване данни инча
И вие може би не го искат да бъде променено от под теб.
Възможно е да се споменава изрично че това е променлива с удар
VaR, ключовата дума тук.
Но това е нещо, за което, че сме забелязали хора са направили в миналото
е, че те се приеме, че то се случва да бъде променлива, когато в действителност,
е константа.
>> Добре, така че тук след това, в този случай, ние не се уточнява всякакъв вид връщане.
Ние ще ви покажем как да се направи че в един момент.
Но забележете, че тук имаме само един прост, ако състояние.
Ако е gradebook празна, което в този случай
е само имуществото на това число масив, тогава ние разпечатате нещо.
В противен случай ние правим нещо друго.
>> Доста ясно досега мисля.
Но ме спре, ако имате някакви въпроси.
>> Сега тази функция, Средно, също взема някои аргументи, или по-скоро един аргумент,
която е gradebook и този път ще се върне двойно тип.
Тъй като това е изчислителна средното и това е
ще се върне, че всъщност изчислената средна до линията на викащия.
>> В този случай, ние се уточни Тип върне след една стрела.
И това може да се почувства вид странно на първо време.
Вие сте свикнал до определяне на възвръщаемостта
Типове пред името на функцията.
Но ако мислите, че на този от гледна точка на математиката,
като, когато имате математика които определят функция,
имате функция с някои входове, и тя произвежда изход.
И това е точно това, което това е трябвало да се имитира.
А има и няколко други езици които имат подобен синтаксис, както и,
но най-вероятно никой, който които сте виждали в CS50.
Но все още не се бърка с него.
Стрелката означава това, което се случва да бъдат върнати в този случай.
ОК, така че как ще да се изчисли тази средна?
Е, ако gradebook е празна, и тогава ние сме
ще се върне 0, което може би разумен начин за лечение на това.
Аз не знам, нека да дойде върнем към това в малко.
Това не може в действителност да бъде разумен начин
да се изчисли средна, ако имаме празен gradebook.
>> Тогава ние просто ще изпълнява нашата сумиране.
Забележете, че тук ние всъщност има заместник версия на
за електрическа верига, която ни позволява да превъртите над всеки един елемент в масив
и постави всеки елемент в своя собствена променлива.
Чрез определяне на клас в gradebook, това, което казваме
е, че ние ще се имплицитно създаване на нов постоянен нарича
клас, който ще представлява всяка уникална позиция в gradebook
всеки път, че за контур итерации.
Така за първи път това е тичам, степен ще
да бъде първа точка в gradebook.
За втори път тя ще бъде най- втори елемент, така и на т.н.
докато има gradebook се изчерпване на елементи.
Тогава ще можем да обобщим, че клас в нашето сумиране променлива
и да се върнете нашата средна както сме виждали преди.
OK, някакви въпроси?
Да?
АУДИТОРИЯ: Имам два въпроса.
Номер едно, хипотетично, може стартирате число на този един?
Не е нужно да бъде двойно, така ли е?
DAN AMRMENDARIZ: Можете ли да Повтарям, че въпрос?
АУДИТОРИЯ: Мога ли да направя число като средна стойност?
DAN AMRMENDARIZ: Можете ли да направя число като средна?
Така че да връща цяло число Средната вместо двойно?
>> АУДИТОРИЯ: можете Return-- имаме, че точно сега по-долу.
DAN AMRMENDARIZ: Точно тук, върнете 0.0?
АУДИТОРИЯ: Да, просто се върнете 0.
Така че това ще бъде или 80 или 85, но не и 85.2.
>> DAN AMRMENDARIZ: Така че в този случай, така че има няколко различни начина
да отговоря на този въпрос.
Нека да отговори на тях в ред.
Така че, ако аз просто направи това завръщане 0, 0 е целочислена стойност.
И така, това ще предизвика тип грешка за този случай
защото тя очаква двойно но след това се връща цяло число.
Ако искам да връща цяло число, което мога.
Мога да зададете типа връщане да INT, върнете 0 тук,
и не изпълнява двойна дивизия.
Но тогава ние ще бъдем правене на целочислено деление.
И така, ние тогава няма да получите Средната че ние вероятно ще очаквам.
Но да можем да модифицирате видовете по този начин.
>> АУДИТОРИЯ: И на второ място, вие има една двойна на върха.
Но по-долу, когато направя върне Double Double,
това е вече автоматично връщане Double формат.
Защо все още трябва да го дефинират със стрелка отгоре с двойна?
>> DAN AMRMENDARIZ: Значи в случай, че това е част
на the-- така да повторя въпроса, защото това е косвена от връщането
типове тук, какъв вид това всъщност е, че трябва да бъде изрично с Swift
за това, което ние искаме да върнат от тази функция
така че, когато тя изпълнява латиница проверка, тя може да се уверите,
че това, което всъщност сме написали по-долу действително отговаря на това.
Така че това е нещо като проверка със себе си подобна ситуация.
Но има are--
>> АУДИТОРИЯ: [недоловим] стрелка?
>> DAN AMRMENDARIZ: Има случаи, когато ние можем да се уточни, че можем имплицитно
зададете типа възвръщаемост.
Но в този случай, аз не правя Мисля, че ще работи.
Има някои други синтаксис че ние ще видим по-късно.
>> Добре, така че този източник код е малко по-различно
защото това прави разбор аргументи от функцията, която ние се обаждате.
Нека ви покажа как работи преди да можем действително да продължат напред
до някои интересни неща , което се случва в Swift.
>> Така че в този случай, ако просто стартирате тази код, забележите, че какво се прави
is-- време, той вид ми дава странни грешки.
Аз трябва да го давате на няколко числа като аргумент на командния ред.
Така че нека да видим, 150 и 80, и натиснете Enter да разберете какво всъщност прави.
Тя приема всеки от тези ценности като цели числа.
Той е като ги въведе в gradebook.
И тогава й е висока че средно изчисление
и извеждане, че както бихме очаквали.
>> Но очевидно има нещо, ще с тази отхвърля нещо
нещо като цяло число.
Както можете да си спомните, от времето, когато бяхме занимаващи се с аргументи от командния ред
в C и други езици, самото начало 0-та позиция в този аргумент на командния ред
списък е името на командата че ние всъщност екзекутиран.
Така че в този случай, аз съм просто примка над всички аргументи на командния ред.
Но аз не правя някаква фантазия проверете, за да прескочим че първо.
Аз съм просто явно или неявно, че съм проверка на които тези видове
са цели числа, преди аз всъщност изпълнява тази изчисление.
>> И това е по същество какво се случва тук.
За всеки аргумент в доводите на процеса е,
Отивам да изпълнява някои проверка.
И в този случай, аз ще съм да се опита първо да конвертирате
този довод в цяло число от извършване изрично typecast,
защото това е, на входа, низ и в действителност не е цяло число.
>> Но това е вид странен синтаксис, ако споделите деление се равнява Int (аргумент).
Какво всъщност се случва тук е изключително
важно да си използва Swift.
Това е използване на това, което е наречено незадължителен тип.
>> Така че тази функция, Int (аргумент), връща не само цяло число, но се връща
което се нарича незадължителен число.
И така, това е нещо тип на върха на тип.
Можете да си представите нещо като него това е връщане като пакет.
И когато отворите, че пакет, тя или
е цяло число, което е резултат, или тя няма абсолютно нищо в него изобщо.
И това е полезно като проверка за грешка механизъм, защото в този случай
можем да разберем, е това тип реализация успешен?
Ако е било, то е в действителност ще трябва цяло число вътре.
В противен случай това ще има някакъв стойност, която ние ще се обадя на нула, което
е представител на не по число на всички.
Това е наистина представителна за нищо.
>> И така, това, ако строителството ни позволява да разопакова, че пакетите,
че по желание на свързване.
И ако ние сме в състояние да разопакова, че опаковат и намери цяло число вътре,
След това, което казваме тук е, че ние ще след това
позволяват тази стойност да се определя в тази константа, наречена клас.
И тази част от отчета, ако, горната част на отчета, ако
ще работи, защото това отварям е била успешна.
>> Ако това се случи, че просто така Имаше грешка може би
в тази изрична тип реализация от низ до цяло число, може би
това е АВС стойност за пример.
И това е, всъщност не става да се превърнат в едно цяло число.
След това тя ще се върне нула, което не е цяло число.
И това ако изявление и след това се провали.
клас няма да съществува, защото тя няма съдържание число.
И това ще изпълня този друг блок, вместо.
Да?
>> АУДИТОРИЯ: Nil е N-I-L?
DAN AMRMENDARIZ: нулева е N-I-L, да.
>> Така че това е може би един от най- трудните неща за Swift,
особено когато сте в плевелите на IOS ап
а ти всъщност се опитва да се направят някои развитие там.
Това ще се крещи при вас за избор.
Това ще бъде ли пита за въпросителни и удивителни знаци.
Но след като разбера out-- ако посвети известно време, за да разберете
какво се случва с допълнителни видове, вие ще си спестите много главоболия
като се опитвате да напиши един апартамент в Swift.
>> Това всъщност е много мощна функция.
И вие просто ще трябва да вземат думата ми за това за сега.
Но ще видим тази конструкция и някои други го обичат
в някои от другите, че изходния код ще ви покажем в съвсем малко.
>> Има ли някакви първоначални въпроси тук?
Така важната храна за вкъщи е, че избор на типа е нещо като metatype.
Той или има стойност, и ако това е така, то тогава
може би ще има тази стойност, свързана с него, или го няма стойност от всякакъв вид,
и е представен от нула.
Останалата част на това е може би както бихте очаквали.
>> Така че нека да се увеличава нагоре трудност за пореден път.
И този път, нека да разгледаме някои други типове данни, че действително съществуват.
Един от тях е речници, което е много подобен на Python речници.
Това е нещо подобно на хеш таблица в C. Това по същество е картографиране на ключове
където ключове могат да бъдат струни.
И когато погледнете нагоре тези ключове, тези ключове ще имат стойност.
Така че това не е съвсем масив, но Вместо това, по-тясно свързана
на картата хеш или хеш таблица.
>> Нека да видим как това е трябвало да работят, преди да можем действително
отидат в източник самия код.
Ако аз просто стартирате тази, нищо наистина се случва.
Той ми казва, че аз съм очаквал някои параметри от следния вид.
Така че аз отивам да предостави на то някои проблемни зададете имена,
така pset0, може би аз имам 100.
И pset1, имам 5.
И тогава на изпита, аз Направих много добре и имам 30.
И Опа, аз удари пространство тук.
>> Когато удари Enter, можете да видите тя изпълнява някои изчисления.
Той казва gradebook е три класове, pset1, pset0, изпит.
И gradebook има тази специфична средна.
Така че отново, ние работим с този gradebook идея,
но ние ще продължим итерации със сложността на нашата функция.
>> Така че в началото, ние сме просто Ще се създаде функция, която
е отговорен за отпечатването на ползването.
А има и този изход функция, която просто ще
принудително спиране на прилагането.
Това не е нещо, което Вие ще използвате в IOS ап.
Това е само в този случай, с аргумент на командния ред.
Сега ще започнат да се движат в посока Xcode.
Но това е специфична команда Програма линия стил в Swift.
>> Нека да разгледаме някои от интересните неща тук.
Нека да видим, само няколко интересни неща говорим може би
е, че в моята функция на отпечатване на броя на марките,
можете да си спомните, че имах този списък на items-- pset1, pset0 и изпит.
Всъщност можете да бързо и лесно да направите това
чрез вземане на gradebook, което е речника, който има ключове и стойности.
Намери всички ключът е чрез метода на дот ключове тук,
и след това използвайте този joinWithSeparator, които след това ще вземе всички ключове
че сме въвели в, pset1-- или Съжалявам, pset0, pset1 и exam--
и да ги свързвам заедно използване на запетая и интервал
да се създаде един дълъг низ.
Тази операция е просто феноменално присъедините полезни при различни условия.
И така е тази joinWithSeparator.
>> И това е едно нещо, което е Swift променя от 1 до 2 Swift.
Няма да бъдат използвани по- Python style-- ако сте
запознат с Python-- на Python стил присъединят метод на низове.
Но това не е вече случаят в Swift 2.
Вие искате да използвате това, ако искате да свързвам масив от неща
заедно с низ.
>> Така че може би след това в нашия обсъждане на средната преди,
това прави малко повече разум за нас, за да настроите функцията средни
да бъде по избор двойна скоро отколкото само с изрично двойно.
Защото имахме, че необичайно състояние, при което,
какво ще стане ако действително gradebook все още няма стойности в него?
Какво трябва средната възвръщаемост?
>> Е, може би в C вас би направил нещо
като условие на стойност страж, като 0.0, или може би с отрицателна стойност,
или нещо просто, като е показателно че е имало някакво условие за грешка
а вие може би всъщност не са способността да се изчисли, че средната.
Ами красотата на посочвате по желание тип би било да се направи това.
И аз сега като каза всички тези думи, но това всъщност не използва Евентуалната.
Но ще видим, че само та, където можем да определят средната
да бъде по избор тип данни, така че ако действително се връща някои данни, след това
ние ще се върне, че данните.
В противен случай ние ще се върне нула, като каза, че това
има никакво смислено изчисляване.
>> Нека да преминем към нещо друго.
Така че от тук, ние сме били гледа всички тези примери в командния ред.
Но наистина това, което ти започваш да се занимават с е Xcode.
И един от най-хубавите неща Xcode е, и по-конкретно в Swift,
е, че ние имаме това нещо, наречено Playground.
И детска площадка е изобщо не е IOS ап.
Но тя ви позволява да експериментирате с Swift по много лесен начин.
Можете да въведете всичките си код.
Това е добре, синтаксис подчертани тук.
Когато създавате нов файл, той ще поиска вас, ако искате да създадете Playground.
Но хубавото на детската площадка е, че в дясно на прозореца,
пък всъщност ти покажа изход от вашия код.
Така че, ако превъртите надолу, можем да видим това, което на изхода на различни редове код
всъщност се случва да бъде.
>> Така че в този случай, ние ще промяна посоки само малко
и да поговорим за нещо, което е наистина важно за това високо ниво начин
че Swift работи, и то е тази идея за затваряне.
И вие вероятно сте виждали това малко в JavaScript.
За тези от вас, които са в CS50, затваряне
са много популярни, много добър начин за правене високо равнище неща в модерни езици.
Но това е също вид трудно да се увийте главата си около първи път.
Така че, ако погледнете в тази за първи път, това е ОК.
Само погледнете в сорс кода и да видите ако можете да го разбера у дома.
>> Така че в този случай, нека да кажем, че сме искате да създадете много експонати
с някои фиксирана стойност.
Така че в този случай мога да се създаде функция.
Отивам да го наричат ​​мощност 2, чиято единствена цел в живота
е да се вземат някои вход и два пъти тя, и да се върнете на тази стойност.
Забележете, че аз съм тук приемане на един тип данни.
Това ще бъде променлива, наречена х.
Това е от тип Double.
И аз отивам да се върне на два пъти тук.
И аз съм просто ще направя много, честно казано, доста
наивен начин за удвояване на тази стойност.
И аз ще ви покажа защо това е полезен само за секунда.
>> Забележете, че тук имаме този диапазон отново. за нещо в 1, точка
дот точка, 2, което означава, че този цикъл ще се проведе два пъти.
Но това представлява фиктивна променлива.
Това означава, че аз не съм наистина ще да се използва тази променлива навсякъде
вътре в този цикъл.
Аз просто искам тази линия код, за да видят два пъти,
без да е необходимо да се знае, стойността на този диапазон.
>> Така че в този случай Бягам резултат пъти х два пъти, което по същество
означава, че аз съм квадратура тази стойност.
И това се случва с работи като бихме могли да очакваме.
Мощност на 2, минаваща на стойност 2.0 ни дава изход от 4.
3.2 произведения за 10.24.
>> Сега можем да направим подобен нещо за мощност от 3.
Но сега се променят само границите.
За фиктивна променлива в 1 през 3, умножете 3 пъти,
и да направи същото нещо.
>> Така че това би могло да се чувствам малко скалъпен.
Но има важна нещо, което тук
е, че те гледа две функции, има
само едно нещо, което е различно, който е тази стойност в интервала.
Всичко останало около тези две функции, мощност от 3 и мощност от 2,
са, в действителност, тъй като идентичен те работят по същия начин.
>> Така че в този момент, малко сигнал за тревога трябва да се случва на разстояние.
Надяваме се това, което казвате, знаете ли, това се чувства малко по-
като дублирането на усилия.
Може би има начин, че бих да може да се капсулира цялата
и да се осигури функция или да създадете функция, която
прави точно това, което искам, без да се налага да го напишете изрично.
И това е, което властта на затваряне ни позволява да направим.
Така че нека да погледнем на това.
И аз ще прекара няколко та по този въпрос, тъй като това
е доста важно за Swift.
Ние виждаме това през цялото време.
Отиваме да се дефинира функция.
Това ще бъде наречен powerOf.
Това ще приеме параметър, наречен у от тип Int.
Но да погледнем на типа възвръщаемост.
Типът на връщане е по- скоби, Double Double стрелка.
Което означава, че тази функция, тази функция powerOf,
се завръща функция.
Това е приемане на Double и връщане на Double.
Така че може да звучи вид лудост, но нека да превъртите надолу малко
и гледам да се види какво се случва.
Ние сме вътре в тази функция powerOf.
Ние сме за създаване на нова функция наречено exponentiator,
но това няма значение какво е то.
>> Забележете, че това е входна стойност на х.
И това е като в двойна и връщане на Double.
И това е един и същ код, че ние Видях по-горе, с изключение на тази на стойност 2
или стойността на 3, че горна граница на този диапазон,
е заменен с тази стойност на у, които
беше първоначално параметър на нашия powerOf функция.
И в този момент, ние върнете exponentiator.
Ние сме връщането на функцията.
>> Това е нещо като малко ум разпенващ.
Но нека си представим какво ще се случи когато аз наричам тази функция powerOf
и да премине в него някаква стойност, като 2.
Какво означава това е, че Сега имам стойността
2 за Y, което означава, че тази стойност ш в тази exponentiator функция
ще бъде тази стойност 2.
Но аз съм този връщане exponentiator функция.
>> Така че забележите това, което казва Swift I са създали в този случай.
нека квадрат е определение, това е функция, която приема Double
и връща двойно.
Аз създадох функция че площади нещо
използването на този механизъм, точно тук.
И наистина това, което се случва е, че се връща тази функция
exponentiator, но тази стойност ш е обвит в нея.
И така, сега всеки път, когато използвате този променлива или константа, наречена
квадрат, то това ще да се държи като функция.
И за да мога да се обадя, че променливата след това като аз бих нарекъл функция,
и да премине в това число, като в този случай 3.
И аз тогава ще изправят тази стойност.
Така 3 на квадрат ще след това стане 9, както можем да видим тук.
>> Наистина луда, но това сега ми позволява възможност
да се създадат други функции powerOf.
Както мога да кажа, OK, и сега искам да се създаде нова функция, powerOf (3),
и съхраняване на тази в константа, наречена куб.
И сега куб ще бъде отделна функция, която след това ще
отнеме известно стойност като ресурс и кубче, че стойност, както можем да видим в най-долния ред
тук.
куб на 2 ще доведе до 8.
>> Надяваме доста чист неща.
Вие никога не сте виждали преди.
Препоръчвам ви да погледнете в капачки и да разследва този малко повече.
Това е наистина мощен неща виждаме много в JavaScript и някои други езици.
Това е наистина жизненоважно значение за разбирането APIs, както и
че ние ще стигнем до само за секунда.
Да?
>> АУДИТОРИЯ: Когато правиш powerOf (2), скоби, и след това
друга скоба, друг input-- което основно подмяна на площада.
DAN AMRMENDARIZ: Така изглеждат в най-последния ред тук.
Всъщност, това е напълно възможно да се направя това верижното както ти предложи.
Така powerOf (5) означава, че отиваме да има exponentiator от 5 до тук.
Така че това е по същество ще бъде най- едно и също нещо като 4 до петата власт,
защото ние създадохме exponentiating функционира до петата власт,
и ние сме преминава в които функционират стойността 4.
И ние получаваме тази стойност че ние очакваме, 1024.
АУДИТОРИЯ: И това не е име, така че е по-лесно
да се чете, на площада каквото.
>> DAN AMRMENDARIZ: Точно така, точно така.
Така че, преди аз просто го сложи в постоянна тук, така че
че го прави лесно да се носи това име.
Да?
>> АУДИТОРИЯ: В този контекст powerOf, това е част
на езика за програмиране за разлика от вас начин
мисля за powerOf в [недоловим]?
DAN AMRMENDARIZ: Значи в този случай, powerOf
е просто името на функция, която аз определено тук.
Така че това не е присъщо до самия език,
но вместо това, тя е просто функция, която е
това име, защото аз го даде това име.
Всякакви други въпроси?
Всичко е наред.
>> Сега това е страхотно.
Но ти няма да видят Много от затваряне функции, които
са като този, където можете да зададете, вътре от една функция, друга функция.
И вие можете да го направите.
Но това не е вид наистина необходимо, нали?
Подобно защо да дефинирам този функция, наречена exponentiator
и веднага след това да го върне.
Защо не мога да просто веднага върнете на тази функция?
>> И в действителност, това е точно идеята зад концепция, наречена
анонимни функции, когато анонимни функции всъщност не
има име, защото те не е необходимо да разполагате с такъв.
И така, в този случай, в 7В, ние можем да намерим точно това.
Всичко това е един и същ код, прави точно същото нещо,
но сега ние сме го леко променена, така че че това powerOf функция веднага
връща функция.
Забележете, че след завръщането, там е една отворена къдрава скоба.
Той е очаквал този вход Double.
Той е очаквал, че продукцията Double.
И тогава в ключова дума разделя самия код.
Така че това е един анонимен функция.
Той всъщност не си име, като има предвид, преди тя да се нарича exponentiator.
Но както видяхме, просто наистина не се отнасят до exponentiator
извън тази функция.
Така че това нямаше значение.
Така че тази анонимна функция е така наречените, защото е безименно,
но тя все още се използва в контекста на този код.
>> Следващите няколко тези, които аз съм Ще продължим да се надяваме
духаше ума си малко.
Ние можем да опрости това още повече.
Тъй като е проницателно посочи по-рано,
Може би ние всъщност знаят, чрез от това заключава код, какво
на изхода на този код ще бъде.
И в действителност, в тази анонимна функция, в действителност можем да заключим, видовете данни.
>> Така че в този мач, ние вече не трябва да определя изрично
вида на данните, който е в вход и изход от тази функция
за няколко причини.
Един от тях е, че сме определени, нагоре към прототип на функцията обвивката,
какъв тип данни тази анонимни функция трябва вход и изход.
И от друга, да заключим от кода
тук, че ние приемаме вход, който е от типа двойно
и връщане на Double.
>> Забележете, че тук не трябва изрично дефинирани имената на аргументите
че тази функция се приема.
И така ние виждаме, ние можем да се отнасят до тези параметри, използващи $ 0, $ 1,
така нататък и така нататък, в зависимост от броят на този параметър се използва
в тази функция.
>> Това е нещо, което вие ще да видите много е това отворено къдрава скоба
определение, последвано от $ 0, и след това някои операция,
и след това затворена къдрава скоба.
Това е анонимна функция който изпълнява тази операция.
Той има този параметър, където това е тип е подразбираща се.
Това първо параметър е 0 $.
А някои операция е случва, че $ 0.
>> АУДИТОРИЯ: Така знака за долар е параметър основно,
и 0 означава първата?
DAN Armendariz: Точно така.
Така знака за долар същество означава, параметър, и 0 означава първия.
Но тя работи по-специално в този случай, където не съм кръстен
аргументите в моята анонимна функция.
>> АУДИТОРИЯ: Има ли нещо, което трябва Perl или този знак за долар, долар 0 там?
DAN Armendariz: Дали които, съжалявам?
АУДИТОРИЯ: Има ли Perl този долар 0, долар 1--
DAN Armendariz: Аз не съм твърде запознат с Perl,
но това, което определя променливи PHP въз основа на долара знаци.
И може да има някои езици които имат функции, като тази.
В действителност, Swift заимства една много функции, като този
от много други езици.
Ние виждаме нотки на Python в него.
Това определение на типа изглежда, че идват от OCaml.
И ние имаме само един куп неща от много различни езици.
Това е една от хубавите неща за Swift
е, че това отнема много от най-добрите идеи от един куп езици
и на всички тях заедно Обувалки в една супер език.
В действителност, ако ми позволите да продължи духаше ума си,
така че ние сме били прави всичко това.
Може би можем да опрости това малко малко по осъзнавайки, че, разбира се,
Swift има exponentiating Тези функции са вградени вътре.
Ако внеса Дарвин, която е само, че библиотеката
Характеристика на тази функция, наречена Pow, сега Мога да се опрости по силите ми, за функция
да бъде следното.
Той ще се върне тази анонимна функция.
>> Но вижте колко е просто това е сега.
Това е функция, която анонимен се приемат някакъв вид данни,
и това ще бъде един доводи, насочени,
съотнесени към $ 0, че е от тип Double.
Той ще се върне тип Double.
Но отчета за връщане сега мълчаливо.
>> И това е точно този стил, че е много, много често в Swift,
навсякъде.
Отиваме да видим това през цялото време в Swift.
Така че аз съм показва всичко това, за да вас, защото на този синтаксис.
Това е много често за да видите, която означава
е анонимна функция че се представя
някои операция на следните аргументи.
И там е косвена възвръщаемост.
Така че това е абсолютно същото нещо за нас да кажа, че това, точно тук.
>> Поради тази къдрава скоба е функция,
ние сме извършите тази операция на първия аргумент.
Отиваме да се върне, че.
Но това е външната връщане връщане, че цялата функция,
че цялата анонимна функция че ние току-що сте създали.
Всякакви други въпроси?
Добре, аз не знам, ако вие сте готови за това,
но можем да отидем още по-луд с Swift.
Готов ли си?
OK, това е страхотно.
>> Сега ние всъщност имаме възможността да, в Swift, поради как модулна
и как е базиран протокол, за да дефинира нашите собствени възбуждате оператори.
Както и в този случай, ние нямахме оператор за exponentiation-- добре,
за извършване на правомощия на нещо.
Но мога да, в Swift, дефиниране на нов Операторът, който прави точно това.
Така че в този случай има куп синтаксис тук.
И аз ще ви позволи да го погледнете у дома, когато се вгледате в това.
Но ние сме определянето на тази въвирам оператор, **, която ще ни позволи след това,
чрез определяне на това, което, че функция ** всъщност
няма да приемат лява ръка страна и от дясната ръка,
и след това да се върне експонентата на това лявата страна на дясната страна.
>> И така, сега изведнъж I Създадохме нов числител.
Така 2 ** 3 означава 2 до трета мощност.
[Против разпенващ SOUND] Това от Самата трябва да ви накара да бъде като,
OK, винт C. Отивам Swift целия път.
Това е чудесно.
Това е доста фантастично.
>> Въпреки, че това е един чудесен пример.
Но аз никога не трябва веднъж извън на този пример, всъщност
дефинирани моя собствен оператор.
Но все пак, той показва Много от силата на Swift
и защо това е всъщност наистина много готино.
OK, нали?
АУДИТОРИЯ: Ако сте Определяне на свой собствен оператор,
как да знаеш, че не правя случайно опитате и да се създаде един оператор, който е
в някъде в C, като скрито някъде в Swift,
като един неясен този, който ви Не може да не сте виждали преди.
>> DAN Armendariz: Така че, ако се опитвате да дефинирате собствени оператори,
съществува риск за определяне една върху съществуващ оператор.
Това отива в степен на подробност, която Не мисля, че имаме време да отидем.
Но това е риск.
И това всъщност е причината, поради Не използвайте символа карета, които
когато сме пишете на властта, ние обикновено използвате 4 карета малко 5 или нещо
ей така, просто, когато сме Gchatting приятели или каквото.
Но в този случай, че действително щяло да предизвика сблъсък.
И така, аз го избягва, само защото Аз се случи да се знае в този случай
че това ще предизвика че сблъсък.
>> Всичко е наред.
Сега за съжаление, за последните седем минути,
Аз трябва да се запази издухване умовете ви малко.
Така че позволете ми да ви покажа някои други неща, както добре.
>> Ние ви показах тази идея за като тези анонимни функции,
това затваряне, които ви позволяват да вид премине функции наоколо.
Можете да ги върне.
Можете да ги манипулира.
Можете да направите всички видове луди неща.
>> Но едно друго нещо, че се случва да бъде полезна
е способността да, за разлика да се връщат тези функции
във функция, за да премине функция като параметър за друга функция.
Може да се мисли и защо на Земята ще искам да направя нещо такова?
>> Е, нека да кажем, че искам да се възползвам от оператор, който I
работили толкова усилено, за да създадете и приложите тя да куп различни номера
в масив.
Така че в този случай имам масив от integers-- 1, 4, 7, 2, 5, 10, 56.
И аз искам да ги удвои.
Начинът, по който бихме обикновено направите това е да просто напишете
прост за линия, която итерации над всички тях
и изпълнява някаква квадратен операция над тях,
въвеждане на тези нови ценности в едно ново променлива, или по-скоро, нов масив тук.
И стойността на продукцията на резултат е след всички тези масиви,
или по-скоро всички, елементи вече квадрат.
>> И ние може да направи същото нещо, за да го cubing,
но малко по сигнал за тревога следва да бъде излизането
казва, че може би има някакъв начин, че бихме
да бъде в състояние да се опрости тази малко.
И в действителност съществува.
Какво става, ако бихме могли да създадем функция, която ни позволява
да приеме, като хищник, функция?
Така че в този случай, да вземе Посетете тези аргументи.
Отиваме да приеме списък на двойки.
И тогава отиваме да приеме функция
в променлива наречена е, което се случва да вземе два пъти и да се върнете на Double.
И цялата продукция от цялата тази функция
наречено Mapper ще върне масив, наречен двойна.
>> Това, което след това ще ми позволи да направите, е да обхождане този списък
и да направи същото нещо, но сега прилага тази функция на всеки
на индивидуалните стойности в този списък.
Така че аз наистина не знам какво е то.
Няма значение за мен.
Но толкова дълго, колкото е необходимо в двойна, някои извършва операция на това,
и след това се връща Двойна, аз след това ще бъде
в състояние да съставят карта на тази функция могат да всеки един елемент от списъка.
>> И този тип програми е наречени висши функции поръчка,
накъде сме се прехвърляха функции наоколо като параметри
и прави неща, с функции.
Това е нещо като да всички тези идеи, които сме научили в CS50
и като ги подреди от до следващото ниво.
И това е всичко, CS51 стил неща.
И така, ние ще отидем в дълбочина повече в класове по този начин.
>> Но това е също важно тук, защото ние
Виждам много функции които се използват в Swift
които по същество прави Това, където имаме
някои цифри, някои масив от числа.
Отиваме да мине, че масив в нашата Mapper.
И ние също започваш да преминат някои функции, които
вече сме дефиниран тук.
Това ще бъде квадрат.
И ние ще се тогава квадратна всички тези номера
и съхраняване на тази в този линк тук.
>> Така че този случай ние определено ни собствена функция, наречена Mapper.
Но точно това нещо е, в действителност, вградена в Swift.
Съществува голямо разнообразие от функции, наречени карта.
Има една функция на картата, има намаляване на функция,
и там е функция на филтър, които по същество прилага функции
на всеки елемент в изброят да ги променя по някакъв начин.
>> АУДИТОРИЯ: Така че, тъй като сте трансформира данните в друг формат
чрез function--
DAN Armendariz: Точно така.
Да, така функцията че ние приемаме
се трансформира данните по някакъв начин.
В този случай, ние бяхме или тя квадратура, или бяхме го cubing,
или наистина, ние може да изпълнява никаква операция върху него изобщо.
>> Но нека да ви покажа как тогава този ще изглежда на практика.
И отново, Бягам а малко време. така че не съм
ще бъде в състояние да премине всички на изходния код тук в подробности.
Но аз Ви препоръчваме да се направи това.
Ние ще го публикуваме възможно най- възможно след този разговор.
>> Но ако се вземе един поглед на това, приемем, че имаме списък с номера,
масив от номера в тази променливи, наречени номера.
След това ние искаме да се извърши това операция филтър на тези номера.
Така филтър е по-висока функция, за която
приема масив и функция.
И на всеки елемент в тази масив, тя изпълнява тази функция.
>> Ако тази функция връща Вярно, той държи тази позиция.
Ако тази функция връща невярна, го изхвърля, че т.
И тогава се връща списък След това, че се състои всички
на тези елементи, които са филтрирани.
>> Така че с други думи, това е една и съща идея, на gradebook.
Ние може да има различни степени в тази стойност, наречена номера.
Може да е 100, и 70, и 40, така нататък и така нататък.
Какво прави този филтър е предизвестие че това е, че синтактична захар
за анонимна функция.
Това е анонимна функция казвайки че параметърът, че аз съм приемане
ще бъде, ако е по-голяма от 70,
След това ще се върнете вярно, което означава, че тази позиция ще се съхраняват в този филтър.
Така че нека да бъдем малко по- по-конкретно за това.
Ако имам този масив от числа и се състои от 100, 70 и 40,
I изпълнява този филтър работа на всеки един от тях.
Така че първо е тази стойност 100.
100-голям или равен 70 е вярно, които
означава, че 100 се съхранява в това ново копие на този масив.
70 също минава.
Но 40 не.
Така че това, което се връща в passingCount е масив от елементи 100 и 70--
100, запетая, 70.
Това бяха единствените две елементи, които са били държани.
И така, причината, поради която бързо премина през много от тези видове с висока цел
нещата са, защото това е, че общата нещо, което ще видите в доста Swift
често, е изпълнение на някои операция използването на тази анонимна функция синтаксис.
>> Има някои готини неща.
Ключове са наистина силни в Swift, Искам да кажа точно като луд, луд мощен.
Можете да използвате превключвател, и всъщност можете да ги прилагат
да диапазони, което е вид лудост, и да направим фантазия подобни неща.
>> Но в последните няколко минути, Искам да прескочите доста далеч
и ще ви покаже конкретен пример за това как ние можем да създадем в IOS ап използвайки Swift.
Така че, когато правиш това, ще трябва да се вземат
а погледнете at-- на Apple, документация, те
има много наистина добри уроци за създаване на първата си кандидатура.
И аз ви насърчавам да се направи че тъй като те ви отведе
през всички етапи на какво точно до кликнете върху, за да се създаде приложение, IOS.
>> Но тук ние имаме това IOS ап.
И това е доста проста ап наистина.
Ако стартирате това, нека да покажем вие на какво прилича.
Всичко, което е по същество прави, че е дърпа от интернет файл JSON
че съм се съхранява на сървър.
И това JSON файл дефинира изображения, които позволяват
ми да след това преминете през, на моя ап, картинки от моя уеб сървър.
>> Така че аз имам тук getNextImage.
Тя зарежда изображение от интернет, и след това го показва на екрана.
>> Така че това е доста проста.
Но целта тук е да се покаже, как ние можем да комбинираме нещата
от последните няколко седмици от CS50 в действително IOS приложения.
С други думи, може би един от най- неща, които вие ще искате да направите,
е да има заявление, че IOS може да тегли данни от интернет
и да се покаже на потребителя някаква информация.
Това е изцяло точката на този изходен код тук.
>> Така че има много какво да се каже за как да се направи действително развитие IOS.
Има много луди синтаксис че сме доста още не сме видели
като клас, какво всъщност е един клас.
Ние до голяма степен може да пренебрегне че за момента.
>> Но забележете, че ние сме съдържаше в рамките на този най-различни неща
че вече съм виждал подобно функции, които имат конкретни имена.
И когато ние даваме тези, Функционира правилните имена
които се очаква да стане до IOS, в действителност това се чувства малко по-вълшебно.
Но когато създавате IOS заявление, има
са специфични имена на функции, които призовани от самия телефон
като заявлението се зарежда, за да се опитам да се създаде процес, който всъщност
спринта на вашата кандидатура.
Така че отново, че има много неща, които аз Трябва да замаже тук, за да можем
да се говори за това специално.
Но аз ви насърчавам да погледнете може би От друга семинара IOS, но също така и някои
на уроци онлайн, което правим много по-добра работа за описване
конкретната информация.
>> Но ние можем да видим няколко неща, които са интересни от кода тук.
Забележете, че ако имаме изявления.
Между другото, едно важно нещо за, ако отчети
е, че скобите около Булев израз са задължителни.
Но фигурните скоби, не са задължителни, без значение колко малко или много редове код
имате в случай изявление.
Вие не може да има, ако отчети без фигурни скоби в Swift.
>> И това е, добре, нещо глупаво.
Но има и исторически причини за това.
Той е трябвало да ви спаси от себе си.
Харесвам това например, че не може премахване на фигурните скоби около които
ако изявление.
Тези, са в действителност е необходимо.
Така че аз Ви препоръчваме да се да разгледаме това.
Но има и още една конструиране, че искам
да ви покажа, че за Swift е нов за Swift 2.0 сравнение
до по-стари версии на Swift, който е следното.
Нека да видим къде го сложих тук?
>> Така че в тази функция, наречена fetchJSON, тази функция
е отговорен за дърпане, че JSON файл от URL, които просто така се случва
да се работи на моя CS50 IDE.
Току-що започна Apache, сложа JSON файл там,
и аз съм в състояние да тегли, че след това данни от интернет, използвайки
тази функция и това URL, която се предоставя от телефона.
Тя е предоставена от библиотека, която можете да използвате, когато
правиш някаква развитие IOS ап.
>> Забележете, че има тази необичайна синтактичен конструкт, наречен охрана.
И наистина всичко това е в Swift е начин за проверка
че някои неща имат са изпълнени, преди да
продължи с останалата част на функцията.
Така че мога да имам, като се използва тази опция тип,
Бих могъл да намери адреса от използвате тази функция NSURL
и съхраняване, че в URL постоянна и след проверка
да видим дали URL е нулева, тъй като тя щеше да се върне на допълнителен тип.
И ако това е нулева, тогава аз ще разпечатате грешка и след това се върнете.
>> Но вместо това, какво ви позволява охрана ни направи, е, че много неща,
но гарантира, че тя е всъщност се случва, че URL
е правилно определен от NSURL.
И ако е така, то тогава прескача това, и то
ще ви позволи да се пристъпи URL като са били дефинирани правилно.
Но ако това е така, че URL не е правилно определено,
ако тази функция се връща грешка или някой друг нещо неочаквано
всъщност се случва, този предпазител конструкт ни позволява да после изход тази грешка
и да се върнете веднага.
Да?
>> АУДИТОРИЯ: Така че това е вид на като ако след друго?
DAN Armendariz: Това е вид като ако след друго, да,
с изключение на това, че URL тогава дефинирано за всичко това долу.
Ако премине на този предпазител, а след това всъщност ще бъде изпълнен с данни
и използваема в останалите изходния код във вашата функция.
Така че аз подозирам, че ти започваш да се започнете да виждате тази охрана, както добре.
И да помнят, че.
>> Така че просто гледам на няколко други неща, това право тук е това,
мислите ли, просто въз основа на това, което ние говорим за преди?
>> АУДИТОРИЯ: Мисли, че ще работи в списъка?
>> DAN Armendariz: Така че това е близо.
Това е функция, която ние сме дефиниране.
И ние сме въвеждане на тази функция като аргумент за тази функция е тук.
>> АУДИТОРИЯ: [недоловим], ако не е нула.
Така че това е в списъка, нали?
>> DAN Armendariz: Ако грешката не е нула, така че is-- така че трябва да преминете.
Е, нека да видим, аз наистина не може да превъртете надясно тук.
грешка е аргумент, който се е предава на тази анонимна функция.
Това е анонимна функция.
Той няма име.
Но ние приемаме тези три аргументи, данни, отговор и грешка.
И тя ще се върне за нищожни и това няма да върне нищо.
И това е съдържанието на тази функция.
И тогава ние имаме достъп вътре, че функция на всяка от тези аргументи.
>> Така че това е вихрушка обиколка на езика.
Но се надявам с това, надявам се, както ви отведе
един поглед към някои от уроците специфични за IOS развитие с Swift,
особено ако отидете Apple, разработчик на уеб page--
те имат много наистина добри уроци, за да започна.
Но да се надяваме само на този час на говорене за синтаксиса си е дал
ти достатъчно, за да започнете с това.
>> Ние ще публикуваме всички този източник код на уебсайта на семинар
възможно най-скоро, а също и слайдовете така че трябва отправна точка за всички онези.
Но късмет с вашите проекти.
И всички много ви благодаря, че дойдохте.
>> [Аплодисменти]