>> [MUZYKI]
>> DAN AMRMENDARIZ: Każdy, Zapraszamy na seminarium CS50,
iOS App Development z Swift.
Jestem Dan Armendariz, a ja jestem nauczycielem Informatyki tutaj na Harvardzie.
>> I następna godzina będzie wicher zwiedzanie tyle rzeczy
na ten temat, jak możemy zmieścić.
Będę pisać cały kod źródłowy które można zobaczyć dziś w Internecie.
Możemy nie być w stanie faktycznie go ponad wszystko
że jestem, że jestem pokazując, w tej godzinie.
Ale przynajmniej mam nadzieję, że dzięki komentarze kodu źródłowego,
będzie można spróbować dowiedzieć się, co dokładnie dzieje się na tych rzeczach
że nie dość dostać.
>> Ogólnie rzecz biorąc, struktura dzisiejsza rozmowa będzie następująca.
Zaczniemy robi kilka podstawowych Składnia z językiem Swift,
wchodząc w niektóre z bardziej zaawansowanych Składnia języka Swift.
Ponieważ język jest naprawdę nowoczesny i go
ma dużo wysokim poziomie cechy, rzeczy, że nie
postrzegane w C przez CS50, lub nawet niektórych innych językach
że zaczęliśmy używając w CS50 jak PHP,
więc będę musiał spróbować wprowadzić także kilka tematów, które
są związane z języków wyższego poziomu że nie może zobaczyć w głębi w CS50,
ale widać na później lekcje informatyki.
Więc to będzie szczelnie zapakowane godzinę.
I prosimy o mnie niech znać, jeśli masz jakiekolwiek pytania.
Więc jeśli jesteś zainteresowany w ten rozwój
ze Swifta, czy naprawdę dowolny iOS app rozwój,
istnieje kilka wymagań.
Przede wszystkim, trzeba być przy użyciu Mac, działa w przykładach
że mamy zamiar używać dzisiaj, stosunkowo nowa wersja OS
X. W tym przypadku używam X 10.5.
Możesz być uruchomiony 10.11, jeśli chcesz.
Ale wszystko, co masz zamiar zobaczyć się z udziałem Xcode 7 i nowsze wersje,
który ma najnowszą wersję Swift, który jest Swift 2.0.
To jest rzeczywiście dość ważne rozróżnienie.
Wiele składni ma zmienił dość znacznie
w niektórych przypadkach z Swift 1.0, który ukazał się w zeszłym roku,
do Swifta 2.0, po prostu wyszedł ten upadek.
Tak więc mamy zamiar pokazać Swift 2.0.
Wiele rzeczy, które szukasz w Internecie
gdy próbujesz uzyskać dodatkowe Informacje o różnych rzeczy
Może chcesz jawnie szukaj Swift 2
a nie po prostu starego Swifta, aby pewność, że otrzymasz składnia poprawne.
>> W istocie, na ogół jest to prawda.
Jest szybki ilość rozwoju dzieje się w języku Swift
odkąd Apple wydała go, myślę, co, to było nieco ponad rok
ale już.
I wszystko się zmieniło znacznie w tym czasie.
I tak nie być sfrustrowany w przypadku, gdy jesteś rozglądając
tematy na Swifta lub jak wykonać coś za pomocą jakiś przykładowy kod
lub coś, co nie działa faktycznie pracują na Swift 2.0.
Upewnij się, że szukasz specjalnie dla tej wersji
starać się zminimalizować skutki odmienne wersje i te różne rzeczy.
>> Postaram się wskazać tylko kilka rzeczy które różnią się od starszych wersji.
Ale to jest coś, na które trzeba uważać.
To prawdopodobnie będzie jeden z największych bólów głowy
że będziesz miał z Swift jest znalezienie przykład kodu, który jest starszy, nawet tylko
przez kilka miesięcy, starając się wykorzystać to w bardziej nowoczesnej projektu.
A to po prostu nie działa.
Stajesz się błędy kompilatora, składni błędy, wszystkie rodzaje szalonej rzeczy.
Więc po prostu być cierpliwy które, mam nadzieję, że i wy będziecie
posiada całkiem miłe doświadczenie z Swift ogólnej.
>> Teraz możesz naprawdę join-- i mam nadzieję, faktycznie jeszcze ten rok--
CS 50 w Apple App Zespół programistów, które
będzie można instalować żadnych aplikacji które można stworzyć na urządzeniach z systemem iOS.
Więc spójrz na tym adresem URL jesteś zainteresowany robić.
>> Więc tylko kilka rzeczy o samej Swift.
To jest skompilowany języka.
Ale widać, że niektóre funkcje, które stosujemy
pozwalają na stosowanie go także w nieco jak interpretowany sposób, jak również.
>> Wiele składni została zapożyczona z C. Jest on oparty oraz napisany w C.
I tak widzimy, że istnieje wiele wynos
z istniejącej wiedzy z C, które możemy port Swift.
>> Ale są rzeczy, które sprawiają, że bardzo różni się od C
To jest bardzo silnie wpisane.
Jest automatyczne zarządzanie pamięcią.
Nie będziemy musieli używać malloc lub wolny wszędzie.
Jest przeznaczony dla ogółu.
Więc innymi słowy, można go używać w wszelkiego rodzaju kontekstach, od Apple Obserwować
iPhone aż do OS X, oraz nawet niektóre serwery, nawet niektóre skrypty.
Ale zobaczymy, że obsługa skryptów
nie jest całkiem tam jeszcze, jak to jest w innych językach.
Więc prawdopodobnie będziesz za pomocą to wyłącznie do rozwoju
na komputerze Mac lub iPhone.
>> I to ma wiele nowoczesnych funkcji.
I wiele z tych rzeczy są rzeczy, które będziemy próbować zająć dzisiaj,
ale także nasze tematy, które szczerze mówiąc, możemy poświęcić całe kursy.
W rzeczywistości, CS 51, który jest oferowane następny semestr,
skupia się wiele na te tematy które są opisane poniżej.
Więc można spędzić cały semestr zrozumienie tych rzeczy.
Ale mamy zamiar spróbować aby przez nich
przynajmniej na tyle, że Ciebie może zrozumieć, co jest
dzieje, gdy patrzysz w Swift programu
i być w stanie włamać się na swój sposób przez to do ostatecznego projektu.
>> Teraz jeden z najlepszych sposobów, że można uzyskać dodatkowe informacje na ten temat
jest szczerze mówiąc po prostu przez Apple pod warunkiem dokumentacji Swift.
Jest wiele interfejsów API , które są dostępne.
I to jest dobra baza dla Ciebie szukać, konkretnych rzeczy, które
chcą zrobić z API udziałem iOS.
Jeżeli chcesz korzystać z aparatu Przykładowo, można zacząć szukać tutaj,
a także korzystać z Google i stos Przepełnienie tak jak zwykle.
>> Wszelkie pytania na ten temat zanim przejść w prawo?
W porządku.
Przejdźmy dalej.
>> Więc po pierwsze, mam liczba przykładowych plików.
I mam zamiar spróbować kroku przez nich stosunkowo szybko.
Jest to plik Hello World dla Swifta.
To bardzo proste.
Jest sposób więcej komentarzy niż jest rzeczywisty kod.
Zauważ, rzeczywisty kod jest w samym dole na linii 14.
Mówi drukiem.
I to jest to wywołanie funkcji.
Jesteśmy przechodząc do niego z Ciąg nazywa Witaj CS50.
Zauważ, że nie ma żadnych średników.
Zauważ, że nie ma int main.
Tam żaden z śmieciem, że mieliśmy z C
Gdy używamy szybki w ten sposób która jest po prostu napisane w pliku tekstowym
i przechowywane na komputerze, a następnie Mogę go skompilować i uruchomić go.
>> Zauważ, że tu jestem nie przy użyciu IDE CS50.
Zakłada się, że jestem uruchomiony i że jestem na OS X
i że mam Xcode już zainstalowany na tej maszynie, aby ta
rzeczywiście funkcjonować.
Ale to jest po prostu normalnym plikiem tekstowym które możemy następnie skompilować i edytować.
Zobaczmy więc, jak to rzeczywiście działa.
Co zrobić, jeśli chcę go skompilować?
swiftc 1.swift.
Po chwili lub dwóch, to zobaczą, że mamy teraz
skompilowany to do pliku o nazwie 1.
A teraz mamy wydrukowane nasze CS50, nasza aplikacja Hello World raczej.
>> Zauważ jedną rzecz jako dobrze jest, że domyślnie,
nie mieliśmy do wejścia a / n, aby wydrukować nową linię.
Domyślnie funkcja drukowania w Swift drukuje nową linię dla Ciebie.
Możesz przekazać opcjonalny dodatkowy Parametr aby poinformować go, aby tego nie robić.
Ale Google więcej informacji na temat tego.
Domyślnie będzie to zrobić linię wydruku.
>> W porządku, więc przejdźmy następnie do innych rzeczy.
Więc jak możemy właściwie zdefiniować zmienne?
Możemy zrobić to za pomocą jeden z dwóch sposobów.
A ten, który chcę powiedzieć, o Definicja ta pierwsza jest wynajęte.
I to jest ważne ponieważ skutecznie
to, co robimy jest określenia stałej.
Mamy zamiar stworzyć zmienną, czy raczej stała nazywa nazwa,
dostarczyć do niego niektóre data-- w w tym przypadku, łańcuch Dan.
Ale za pomocą tego let słów, mówimy
że zmienna-- lub ponownie constant-- nazywa
nazwa nie zostanie zmieniona.
To będzie niezmienna w całym Czas trwania tego programu
lub całej Czas kontekście
że zmienna jest dostępna.
>> To jest bardzo ważne, że gdy masz jakieś dane, które nie jest
zamiar zmienić w programie, i zobaczysz wiele przykładów
o tym, kiedy chcemy użyć dać w stosunku do drugiej składni
ważne jest, aby używać let wszędzie tam, gdzie to możliwe, ponieważ To informacja
język, który jest nie będzie zmieniony,
i może faktycznie wykonywać wiele optymalizacje
poprawić prędkość i bezpieczeństwo twojego programu.
I bezpieczeństwa, to znaczy nie pozwól Crash to z szalonymi błędów
że możemy być przyzwyczajeni do oglądania w C.
>> Wtedy możemy użyć interpolacji ciąg do hermetyzacji tego ciągu znaków.
Tak więc widzimy, w tym Linia wydruku, cześć,
a następnie za pomocą otwartych nawiasów ukośnikowe, a następnie nazwa mojego zmiennej,
w tym przypadku stałej, zamknąć nawiasy.
Ja w zasadzie to stawianie Zawartość tej zmiennej o nazwie imię i nazwisko
wewnątrz łańcucha, a następnie drukowania nie wynik.
>> Jest jeszcze jedna zmiana do tego pliku: które jest, że mam, na samej górze,
umieścić w linii shebang, które w zasadzie tylko określa
że chcę używać Swift tłumacz, który
Oznacza to, że nie mam już do skompilować ten konkretny program.
Mogę tylko uruchomić go jak własnego scenariusza.
Jednak to, w tym przypadku, za sceny są opracowywane, a następnie
jest prowadzony.
To jest po prostu dla nas niewidzialne.
>> W porządku, więc przejdźmy dalej.
Więc jest nieco oszustwa że tak się stało wcześniej.
Pokazałem ci, że może określić stałą.
I mógłbym podać kilka danych, aby to zrobić.
Ale w tym przypadku zauważyć, że tego nie zrobiłem właściwie określić typ danych
że jest.
A to dlatego, że Kompilator, Swift może
wywnioskować, typ danych, tylko w oparciu na danych, które umieściłem w nim.
Ponieważ wiadomo, że ocena ta Zmienna tutaj, prawo to dane
tutaj, to wie, że jest to ciąg znaków.
I tak stała ta nazwa jest zatem Będzie ciąg, jak również.
>> Ale możemy być jawne o rodzaju, który jest
mamy zamiar użyć do stałe lub zmienne
za pomocą tej składni instead-- niech String nazwa okrężnicy równa
Dan, który w tym przypadku oznacza, że ​​jesteśmy będzie określenie stałej zwanej nazwę.
To będzie typu String.
A wartość będzie Dan.
Teraz w drugą stronę, że możemy stworzyć variables--
i są zmienne Zmienne, które Oznacza to, że w rzeczywistości dzieje
zmienić ich zawartość kiedyś w czasie trwania kontekście
że zmienna jest defined-- my użyć słowa kluczowego var, zamiast pozwolić.
Ale znowu, domyślnie, jeśli nie wiesz, że trzeba manipulować, że dane,
spróbuj użyć pozwolić na wydajności.
>> W tym przypadku, możesz wtedy określić typ danych
że spodziewamy się wewnątrz ta nowa zmienna o nazwie etykiety.
To będzie ciąg.
I będziemy następnie złączyć dwa ciągi razem, łańcuch witam,
a ciąg reprezentowany przez zmienna, a raczej stała nazwa.
>> Więc to jest dobre, bo to PHP jest trochę jak w tym my
bardzo łatwy konkatenacji.
Nie trzeba się automatycznie używać jakichkolwiek zarządzania pamięcią
zwiększyć rozmiar i robić każdy rodzaj zabawnych rzeczy tam.
To działa jak byśmy rzeczywiście spodziewać.
>> W porządku, wszelkie pytania na ten temat?
>> Teraz drugi powód, dla którego musimy mieć możliwość
aby móc określić co typ zmiennych danych są
Jest tak, ponieważ czasami nie Aby zainicjować zmienne
z niektórych danych w punkt definicji.
Więc w tym przypadku, powiedzmy, że chcę, aby rozpocząć wprowadzanie
niektóre gatunki na książki gatunku.
Dobrze wiem, że jeden z Zmienne, które chcę mieć
ma być zmienne klasy.
I wiemy też, że my ma to być liczbą całkowitą.
Ale może jeszcze nie mają, że klasa jest dostępna.
>> W Swift, trzeba określić typ danych
który wiąże się z Zmienna lub pozwól stałe
zanim można rzeczywiście używać tej zmiennej.
Bo to jest silnie wpisane, trzeba skojarzyć typ
z tych zmiennych.
>> Więc w tym przypadku, jeśli nie mam właściwie zainicjowana pierwsza z jakąś wartość,
to muszę powiedzieć, Swift, co Spodziewam się, że typ danych, aby być.
I to będzie nadal że ten sam typ danych
w całej historii tego programu.
>> Teraz możesz mieć ochotę jak najszybciej Stworzyłem tę zmienną klasy
i pod warunkiem, że jest całkowita 100, gdybym
chcesz spróbować łączyć ciąg z tej liczby całkowitej,
może ulec pokusie, aby nadal korzystać że operator konkatenacji
jak my zaledwie kilka wierszy wcześniej.
Ale niestety, to faktycznie nie będzie
pracować, bo jesteś zasadniczo wykonywania
Operacja na dwóch różnych typów.
>> Teraz jest to bardzo różni się od innych w językach takich jak PHP, które są naprawdę
Loosey goosey swoim rodzaju typów.
Oni po prostu lubią, tak, co, mnie to nie obchodzi.
Daj mi tylko jeden rodzaj i Może zrobię to, co trzeba.
>> W tym przypadku, jest szybki bardzo surowe o rodzajach
że masz do czynienia.
Ten operator podsumowanie lub operator konkatenacji
ma zasadniczo parę różne możliwe opcje.
Możesz zrobić sumowanie z liczb całkowitych, lub
może zrobić konkatenacji, a być może kilka innych rzeczy, jak również.
Ale jeżeli ten podmiot nie uznaje co jest po obu jej stronach,
czy raczej połączenie tych dwa rodzaje, nie jest to, co spodziewa się,
wtedy to będzie powodować awarię.
>> Więc w tym przypadku, co to znaczy mieć ciąg plus całkowitą?
Również w tym kontekście to, że prawdopodobnie chcesz
zrobić operację konkatenacji.
Ale oczywiście komputer nie ma tego rodzaju sytuacji.
A więc musimy zapewnić że dodatkowe informacje
do niech wiedzą, co to jest to, że chcemy zrobić.
>> Więc innymi słowy, fakt, że Swift jest silnie wpisany
oznacza, że ​​trzeba zrobić trochę dodatkowej pracy
aby dostać się do obsługi sposób, że chcesz.
A w rezultacie jest bardziej bezpieczne.
A kiedy już się pod uwagę tych typów,
rzeczy po prostu szczerze zacząć działają całkiem dobrze.
>> Tak więc w tym przypadku, to wtedy wykonywanie operacji konkatenacji
jawnie odlewania liczbę całkowitą na łańcuch
przez otoczenie go w tym Kapitał Funkcja S String,
a następnie za pomocą połączonego łańcucha znaków Operator zmodyfikować naszą zmienną etykiety,
a następnie wydrukować go.
>> Jak na razie dobrze?
Dobrze, przejdźmy dalej.
>> Obecnie istnieje wiele danych typy, które możemy używać w Swift.
Jak przyzwyczaili się do, możemy stworzyć zmienny tablicę.
I że tablica może tylko zawiera jeden typ.
>> Więc w tym przypadku, mamy zamiar stworzyć a Zmienne tablice liczb całkowitych, które
nazwiemy stopnie, a my będziemy w stanie aby zapisać, że w nawiasach kwadratowych
Format jak ty wyrosłeś przyzwyczajeni w różnych językach.
Ale zauważ, że tu jesteśmy definiowanie kilka rzeczy.
stopnie jest zmienny zmienna-- nie używać słowa kluczowego let.
Więc to oznacza, że ​​możemy to zmienić zawartość tej tablicy.
To jest typu Array Int, i możemy powiedzieć, że
na podstawie tych nawiasach kwadratowych tutaj.
>> Teraz jeden z miłych rzeczy jest to, że
mają dostęp do wielu Dodatkowe informacje
o tablicy tylko przy użyciu niektóre proste zapis dot.
Tak na przykład, grades.count zapewnia nam
liczba elementów, które istnieją w tym Tablica, którą możemy następnie przejść dość
łatwo po prostu za pomocą tego zapisu dot.
>> Jeśli chcesz dodać dodatkowe elementy do tej tablicy,
nie można zrobić w stylu PHP gdzie po prostu wyraźnie zdefiniować,
w danym indeksie, niektóre wartości które chcesz wstawić.
Zamiast tego należy użyć append Sposób typu matrycy
dołączyć ten element, 95, do tej listy.
>> Więc teraz ta tablica ma następujące contents-- 100, 0, 90, 85.
A teraz mamy dołączone 95, który również.
>> Istnieją inne sposoby możemy dołączyć rzeczy.
Rzeczywiście można używać operator podsumowanie,
które będą interpretowane jako operacja tablica append.
I możesz dołączyć kolejny tablica, której zawartość jest 70 i 80,
do tej tablicy.
Więc teraz mamy Zawartość w tej zmiennej
grades-- 100, 0, 90, 85, 95, 70 i 80.
To jest po prostu ładny, mały składniowym Cukier, że Swift dostarcza nam.
>> Więc jeśli chcemy zsumować stopnie, jesteśmy być może
będzie chciał iteracji na każdej pozycji w tej pętli.
I mamy w Swift, pojęcie z pętli for, jak można by oczekiwać.
Ale sposób, że wskazuje zakres jest nieco inny.
Tak więc w tym przypadku, w celu Podsumowując wszystko, będziemy
zamierza stworzyć tymczasowy Zmienna o nazwie suma w porządku dla nas
utrzymać tę liczbę.
>> I zauważyć naszą Dla Budowa tutaj pętli.
Dla indeksu 0 .. <grade.count.
Więc ta konstrukcja, 0 .. <grades.count jest operacją Zakres gdzie jesteśmy
mówiąc, że mamy zamiar stworzyć zakres liczb całkowitych od 0 do góry
ale z wyłączeniem grades.count.
Tak więc będzie to 0, 1, 2, 3, 4, 5, do czasu jednak wiele jednego
przed grades.count.
>> Więc to jest inaczej niż jak typowo stosuje się w pętlach
gdzie masz jakieś indeks Zmienna, ustawić równą 0 w pierwszym,
a następnie zintegrować, że do niektórych wartość mniejsza niż liczba elementów
w tej tablicy.
>> Więc nie jest to modyfikacja do tego, w rzeczywistości,
co pozwala nam w bardzo prosty sposób ustawić różne rodzaje zakresów.
Jeśli zmienisz ten zakres do trzy kropki, 0 ... grade.count,
ten reprezentuje zakres 0 do grades.count włącznie,
co oznacza, że ​​liczba ta jest również Następnie wymienione w tym zakresie.
>> Ale to jest bardzo przydatne dla tych dokładnych rzeczy,
gdy mamy do wykonania iteracje ponad pętli
bo te indeksy są zera indeksowane, jak widzieliśmy w innych językach
równie dobrze.
Wszelkie pytania na ten temat dla pętli?
>> Więc nie ma ukrytych definicji tej zmiennej indeksu,
których wartość zaczyna się od 0, a nadal przy każdej iteracji pętli
zwiększy się o 1 w górę, aż do punktu który jest równy grades.count,
w którym miejscu, pętla przerywa.
>> Zauważ, że w naszym ciąg interpolacji tutaj,
faktycznie możemy wykonać kilka prostych manipulacje do tych wartości.
Więc indeksu plus 1 będzie w rzeczywistości wykonać sumowanie tej wartości
ponieważ indeks jest w tym przypadku liczbą całkowitą.
I w tym momencie, że będzie następnie przekształcić do łańcucha
i tym ciągu interpolowane tutaj i drukowane, jak moglibyśmy oczekiwać. ,
>> I miła rzecz o tablicach tutaj jest
które mogą również mieć wartości pobierając i wartości ustawień
za pomocą notacji nawiasu kwadratowego jako widzieliśmy w innych językach.
>> W porządku, więc tutaj, teraz obliczyć naszą sumę wszystkich naszych gatunków.
Teraz jakby następny logicznym krokiem byłoby
wykonać operację dzielenia się znaleźć na średniej z tych klas.
Ale coś ważnego tutaj się dzieje, które
jest to, że suma ta jest chyba liczbą całkowitą.
Ale musimy wykonać pewne rodzaj podwójnego podziału.
I to ma być niezwykle ważne, gdy
chcemy wykonać tę operację, bo to, co mówimy,
jest to, że musimy rzeczywiście wykonać podział na dwa dwuosobowe.
I znowu, ponieważ Swift jest bardzo silnie wpisane,
musimy jawnie ustawić wszystkie z elementy do deblu, zanim rzeczywiście
wykonania tej operacji.
>> Aby więc dla nas wykonać podwójny podział,
to nie jest wystarczające dla tylko jeden z tych elementów, aby być podwójne.
Obaj mają być dwukrotnie, aby szybko
aby mieć pewność, że ten jest to, co chcemy zrobić.
Więc będzie to wyraźnie typecast suma, którą mamy obliczony powyżej
a liczba gatunków do deblu, a następnie wykonać tę operację i sklep
że w tym nowym zmiennej, a raczej ta nowa stała zwana średnia,
które będą miały na rodzaj, to sobie wyobrazić?
Podwójne, tak.
Tak więc w tym przypadku nie trzeba go określić
bo można wywnioskować z Operacja jaki rodzaj średniej danych
będzie.
Swift jest ogólnie bardzo dobry o jest w stanie wywnioskować typy.
>> Chcesz zobaczyć uruchomić, czy mogę przejść?
Chcę iść dalej.
Wszelkie pytania dotyczące któregokolwiek z tego?
Wielki.
>> Teraz mamy zamiar rozpocząć dostać się do dobre stuff-- funkcje definiowania,
i kilka innych typów, które są unikalne dla Swifta, że ​​nie mają
widoczne w innych językach aż do tego punktu,
ale są obecne w innych w językach, które można znaleźć później.
Więc po pierwsze, jeśli chcesz w celu określenia funkcji
zdefiniować go funky słowa Funkcja, a następnie nazwa funkcji,
a następnie w nawiasach, argumenty że chcesz, że funkcja do zaakceptowania.
Argumenty muszą również specify-- generally--
Należy również określić typ danych, które są, o ile nie mogą być zakładane.
I zobaczymy, że niewiele zastrzeżenie w tylko trochę.
>> Więc w tym przypadku mamy Funkcja o nazwie printGradeCount.
Jedziemy do zaakceptowania zmienna-- czy też w tym przypadku,
constant-- nazywa ujawniać ich.
I to ma być typ tablicy liczb całkowitych.
Teraz jest coś to jest naprawdę ważne tutaj
że chcę, aby zrozumieć.
Oznacza to, że domyślnie te argumenty które są wejścia do tej funkcji są
zdefiniowane przy domniemanym słów kluczowych let, co oznacza, że ​​nie mogę zmienić tego
ujawniać zmienna tutaj.
A tego typu ma sens, dlatego, że przekazywanie danych w.
A ty chyba nie chcesz go zmiana z pod tobą.
Możliwe jest wyraźnie wskazuje że jest zmienna poprzez umieszczenie
słowo kluczowe tutaj var.
Ale to jest haczyka, że ​​mamy zauważyłem ludzie zrobili w przeszłości
jest to, że zakłada się, że będzie być zmienne, podczas gdy w rzeczywistości
Jest to stała.
>> W porządku, więc o to, w tym przypadku, my nie podając żadnego rodzaju zwrotu.
Pokażemy Ci, jak to zrobić że za chwilę.
Ale zauważ, że mamy tutaj tylko proste, jeśli stanie.
Jeśli dziennik ocen jest pusta, która w tym przypadku
jest tylko własnością tej liczby całkowitej tablicy, następnie wydrukować coś.
W przeciwnym razie możemy coś jeszcze zrobić.
>> Bardzo proste do tej pory myślę.
Ale mnie zatrzymać, jeśli masz jakiekolwiek pytania.
>> Teraz ta funkcja, średnie, również trwa niektóre argumenty, a raczej jeden argument,
który jest ujawniać, tym razem ma zamiar powrócić podwójne typu.
Bo to jest informatyka średnia i to
będzie rzeczywiście powrócić, że Obliczony średni do linii telefonicznej.
>> W tym przypadku należy określić typ powrócić po strzałką.
A może to poczuć trochę dziwne na początku.
Urosły przyzwyczajeni do ustawiania powrotu
typ przed nazwą funkcji.
Ale jeśli myślisz, że tego w zakresie matematyki,
jak wtedy, gdy masz matematyki które wyznaczają funkcję
masz funkcji z niektórych Wejścia i produkuje wyjście.
I to jest dokładnie to, co to ma naśladować.
I jest kilka innych językach które mają podobną składnię, jak również,
ale chyba żaden nie widziałem w CS50.
Ale nadal nie mylić przez nią.
Strzałka oznacza, co się dzieje być zwrócone w tym przypadku.
OK, więc jak będziemy do wyliczenia tej średniej?
Cóż, jeśli dziennik ocen jest pusty, a następnie jesteśmy
zamiar powrócić 0, co może rozsądnym sposobem leczenia tego.
Nie wiem, niech się z powrotem, że w trochę.
To nie może właściwie być rozsądnym sposobem
obliczyć średnią if mamy pusty ujawniać ich.
>> Potem po prostu wykonywać naszą sumowanie.
Zauważ, że tutaj rzeczywiście mają alternatywną wersję
pętli, co pozwala nam do iteracji na każdej pozycji w tablicy
i umieścić każdy element do własnej zmiennej.
Poprzez określenie dla klasy w ujawniać, co mówimy,
jest to, że będziemy w sposób dorozumiany utworzyć nową stałą o nazwie
gatunek, który będzie reprezentować każdy unikatowy element w Dziennik ocen
za każdym razem, że dla iteruje pętli.
Tak więc po raz pierwszy, że jest prowadzony, klasa będzie
być pierwsza pozycja w Dziennik ocen.
Po raz drugi będzie taki Drugi element, tak dalej i tak dalej
aż ujawniać ma wyczerpał się elementów.
Wtedy będziemy mogli podsumować, że klasy do naszej zmiennej sumowania
i zwrócić naszą średnio jak widzieliśmy wcześniej.
OK, jakieś pytania?
Tak?
PUBLICZNOŚCI: Mam dwa pytania.
Numer jeden, hipotetycznie, mogą uruchomić całkowitą na ten jeden?
Nie musi być podwójne, czy to prawda?
DAN AMRMENDARIZ: Czy możesz Powtarzam to pytanie?
PUBLICZNOŚCI: Czy mogę zrobić całkowita jako średnia?
DAN AMRMENDARIZ: Czy możesz zrobić całkowitą jako średnia?
Tak zwraca liczbę całkowitą Średni zamiast podwójnie?
>> PUBLICZNOŚCI: Return-- was mają, że teraz poniżej.
DAN AMRMENDARIZ: Tutaj, powrócić 0.0?
PUBLICZNOŚCI: Tak, po prostu zwraca 0.
Tak więc będzie to albo 80 lub 85, ale nie 85,2.
>> DAN AMRMENDARIZ: Więc w tym przypadku, więc istnieje kilka różnych sposobów
odpowiedzieć na to pytanie.
Pozwól mi odpowiedzieć na nie w porządku.
Więc jeśli po prostu zrobić to powrót 0, wartość 0 jest liczbą całkowitą.
I tak, że spowoduje Błąd rodzaju w tym przypadku
dlatego, że spodziewa się podwójne ale jest to powrót liczbę całkowitą.
Jeśli chcę wrócić liczbę całkowitą, mogę.
Mogę ustawić typ zwracanej int, zwraca 0 tutaj,
i nie wykonywać podwójne podział.
Ale wtedy będziemy robi podział całkowitej.
A więc to nie dostać Średnio, że będziemy prawdopodobnie spodziewać.
Ale tak możemy zmodyfikować typy w ten sposób.
>> PUBLICZNOŚCI: A po drugie, ci mają jedno podwójne na górze.
Ale na dole, kiedy nie wrócić dwuosobowy,
to już automatycznie powrót podwójnym formacie.
Dlaczego trzeba jeszcze go zdefiniować ze strzałką na górze z podwójnym?
>> DAN AMRMENDARIZ: Tak W przypadku, gdy ten znajduje się
z the-- więc powtórzyć pytanie, bo jest ukryte z powrotem
Typy tutaj, jakiego typu to w rzeczywistości jest, musimy być jednoznaczne z Swift
o tym, co chcemy powrót z tej funkcji
tak, że kiedy występuje typ sprawdzanie, może upewnić się,
że to, co rzeczywiście napisane na dole rzeczywiście spełnia to.
Więc jest to coś w rodzaju kontroli z siebie coś w rodzaju sytuacji.
Ale are--
>> PUBLICZNOŚCI: [niesłyszalne] WWW?
>> DAN AMRMENDARIZ: istnieją przypadki, gdy możemy określić, że możemy w sposób dorozumiany
ustawić typ zwracanej.
Ale w tym przypadku, nie wiem myślę, że będzie działać.
Jest jakaś inna składnia które zobaczymy później.
>> W porządku, więc to źródło Kod jest trochę inaczej
bo ten analizuje argumenty z funkcja, że ​​dzwonisz.
Pokażę ci, jak to działa zanim rzeczywiście przejdziemy
do ciekawych rzeczy że dzieje się w Swift.
>> Więc w tym przypadku, jeśli po prostu uruchomić to Kod, zauważysz, że to, co robi
jest-- natomiast, to niby daje mi dziwny błąd.
Trzeba przekazać to kilka liczbami całkowitymi jako argument wiersza poleceń.
Zobaczmy więc, 150 i 80, i naciśnij klawisz Enter dowiedzieć się, co to faktycznie robi.
To przyjmowania każdego te wartości jako liczby całkowite.
To wprowadzanie ich w Dziennik ocen.
I wtedy to podczas występu że obliczanie średniej
i wyprowadzania że spodziewamy.
>> Ale oczywiście coś się dzieje na odrzuceniu coś z tym
coś w postaci liczby całkowitej.
Jak może pamiętacie od kiedy byliśmy czynienia z argumentów wiersza poleceń
w C i innych językach, pierwszy 0-tej pozycji w tym argumencie wiersza poleceń
Lista jest nazwa polecenia że faktycznie wykonywane.
Więc w tym przypadku, jestem po prostu pętli w stosunku do wszystkich argumentów wiersza poleceń.
Ale nie robię jakiś rodzaj fantazji sprawdzić, aby przejść nad tym pierwszym.
Ja jestem tylko jawnie lub niejawnie jestem sprawdzenia, które z tych typów
są liczbami całkowitymi przed I rzeczywiście wykonania tego obliczenia.
>> I to jest w zasadzie co sie tu dzieje.
Dla każdego argumentu w Argumenty procesu jest,
Mam zamiar wykonać jakąś kontrolę.
I w tym przypadku, zamierzam aby spróbować najpierw przekonwertować
że argument do liczby całkowitej przez wykonania jawnej typecast,
bo to, na wejściu, ciąg i nie jest w rzeczywistości całkowitą.
>> Ale to jest rodzaj składni dziwne, jeśli pozwól klasy wynosi Int (argument).
Co się rzeczywiście dzieje tutaj jest bardzo
ważne dla używając Swifta.
To jest za pomocą co nazywa się opcja Typ.
>> Tak więc ta funkcja, Int (argument), zwraca nie tylko liczbę całkowitą, ale powraca
co nazywa opcjonalną liczbą całkowitą.
A więc jest to swego rodzaju typ wierzchem typu.
Jakby można sobie wyobrazić, jak to wraca jak opakowania.
A po otwarciu, że Opakowanie to czy
jest liczbą całkowitą, która jest wynikiem albo ma absolutnie nic w nim w ogóle.
I jest użyteczny jako kontrolę błędów Mechanizm, ponieważ w tym przypadku
możemy dowiedzieć się, był to Typ konwersji sukces?
Jeśli tak, to w rzeczywistości będzie mieć całkowitą wewnątrz.
W przeciwnym razie będzie musiał niektórych wartości, które my nazywamy zerowe, które
reprezentuje brak całkowitą w ogóle.
To naprawdę przedstawiciel nic.
>> A więc, jeżeli budowa pozwala nam rozpakować tego pakietu,
że opcja wiązania.
A jeśli jesteśmy w stanie rozpakować, że spakować i znaleźć liczbę całkowitą w środku,
to co mówimy, tutaj jest to, że będzie to
pozwalają, że wartość należy ustawić na stała ta nazywa klasa.
I ta część instrukcji if, górna część if
będzie działać, bo to unwrap powiodło.
>> Jeśli tak się składa, że wystąpił błąd może
w tym wyraźną konwersji typu z ciągu znaków na liczbę całkowitą, może
jest to wartość, na przykład ABC.
I to właściwie nie dzieje do konwersji na liczbę całkowitą.
Następnie powróci nil, co nie jest liczbą całkowitą.
I to także wtedy, gdy oświadczenie nie.
klasa nie istnieje, ponieważ nie ma zawartości całkowitej.
I będzie zamiast uruchomić ten blok innego.
Tak?
>> PUBLICZNOŚCI: Nil jest N-I-L?
DAN AMRMENDARIZ: nil jest N-I-L, tak.
>> Więc to jest być może jednym z najtrudniejsze rzeczy o Swift,
zwłaszcza gdy jesteś w chwasty na app iOS
a ty rzeczywiście próbuje zrobić kilka rozwój tam.
To będzie krzyczeć na ciebie o opcjonalne.
To będzie pytanie o znaki zapytania i wykrzykniki.
Ale kiedy się dowiedzieć out-- jeśli Ciebie poświęcić trochę czasu na zastanawianie się,
co się dzieje z opcjonalnych rodzajów, zaoszczędzisz sobie sporo bólu głowy
jak próbujesz Napisać aplikację w Swift.
>> W rzeczywistości jest to bardzo potężne narzędzie.
A ja po prostu trzeba Uwierz mi na słowo to teraz.
Ale zobaczymy tę budowę i kilka innych podoba
W niektórych innych kodu źródłowego, pokażemy, w tylko trochę.
>> Czy są jakieś wstępne pytania tutaj?
Tak więc ważne jest to, że na wynos opcjonalnie typ jest swego rodzaju metatype.
To albo ma wartość, a jeśli tak, to
być może ma to wartość związaną z nim, lub nie ma żadnej wartości,
i jest reprezentowana przez zera.
Reszta jest to chyba jak można się spodziewać.
>> Więc ziemi do Trudność jeszcze raz.
I tym razem, rzućmy okiem na niektóre inne typy danych, które rzeczywiście istnieją.
Jednym z nich jest słowników, które bardzo podobne do słowników Python.
Jest nieco podobny do tabeli mieszania w C. Zasadniczo jest to mapowanie klawiszy
gdzie klucze mogą być ciągi.
A kiedy patrzysz się te klucze, te klucze będą miały wartość.
Więc to nie dość, tablica, ale zamiast bardziej związani
do mieszania mapie lub tabeli mieszania.
>> Zobaczmy, jak to ma do pracy, zanim rzeczywiście
przejść do kodu źródłowego samego.
Jeśli po prostu uruchomić to, nic tak naprawdę się dzieje.
To mówi mi, że spodziewam Niektóre parametry następnego typu.
Więc mam zamiar dostarczyć do to jakiś problem ustawić nazwy,
tak pset0, może mam 100.
I pset1, mam 5.
A potem na egzaminie, ja tak naprawdę dobrze i dostał 30.
I oops, I hit miejsce tutaj.
>> Kiedy naciśnij Enter, można zobaczyć wykonuje pewne obliczenia.
Mówi dziennik ocen jest trzy stopnie, pset1, pset0, egzamin.
I ujawniać ma ten specyficzny średniej.
Więc jeszcze raz, pracujemy z tym ujawniać idei,
ale będziemy kontynuować Iterowanie ze złożonością naszej funkcji.
>> Tak więc na początku, jesteśmy po prostu zamierza utworzyć funkcję
jest odpowiedzialny za drukowanie wykorzystanie.
I jest to zjazd Funkcja, która będzie po prostu
przymusowo zamknąć aplikację.
To nie jest coś, co można używać w iOS aplikacji.
To jest tylko w tym przypadku, z argumentem wiersza poleceń.
Następny zaczniemy kierunku Xcode.
Ale to specyficzne polecenie linia programu styl Swift.
>> Rzućmy okiem na niektóre z ciekawych rzeczy tutaj.
Zobaczmy, tylko kilka ciekawych rzeczy wspomnieć, być może
jest to, że w swoim funkcji drukując szereg klas,
Może pamiętacie, że miałem tę listę z items-- pset1, pset0 i egzaminu.
Można rzeczywiście szybko i łatwo to zrobić
poprzez ujawniać ich, co jest Słownik, który ma klucze i wartości.
Znajdź wszystkie klawisze, jest przez metoda tutaj klawisze kropka,
a następnie użyć tego joinWithSeparator, które następnie wszystkie klawisze
że mieliśmy wpisane, pset1-- lub Przepraszam, pset0, pset1 i exam--
i złączyć je razem za pomocą przecinka i spacji
stworzyć jeden długi ciąg.
Ta operacja jest po prostu fenomenalnie przyłączyć użyteczna w różnych kontekstach.
I tak to jest to joinWithSeparator.
>> I to jest jedna rzecz, która jest zmieniony z Swift 1 do Swift 2.
Tam kiedyś Python style-- jeśli jesteś
zaznajomieni z Python-- pytona Styl dołączyć metodę na sznurkach.
Ale to nie jest już w przypadku Swift 2.
Chcesz użyć, jeśli chcesz Łączenie tablicy rzeczy
wraz z ciągiem.
>> Więc może to w naszym dyskusja średnio przed,
to sprawia, że ​​trochę więcej sensu dla nas, aby ustawić średnią funkcji
być opcjonalne podwójne raczej niż tylko wyraźnego podwójnym.
Ponieważ mieliśmy, że niezwykły stan, w którym,
co, jeśli dziennik ocen rzeczywistości nie ma wartości w niej?
Co powinno średni zwrot?
>> No cóż, może w C można zrobiłby coś
jak przewidziane wartości wskaźnikowych, jak 0,0, a może to liczba ujemna,
czy coś po prostu reprezentuje fakt, że jakiś stan błędu
i być może w rzeczywistości nie mają możliwość obliczyć tę średnią.
Cóż piękno określając opcjonalnie Typ byłoby to zrobić.
A ja teraz mówiąc wszystkie te słowa, ale to faktycznie nie wykorzystuje ewentualne,.
Ale zobaczymy, że w ciągu minut, gdzie możemy ustawić średni
być opcjonalnie typ danych, tak, że jeśli rzeczywiście zwraca niektóre dane, a następnie
wrócimy tych danych.
W przeciwnym razie wrócimy nil, mówiąc, że to
ma znaczący obliczeń.
>> Przejdźmy do czegoś innego.
Więc tutaj, byliśmy patrząc na wszystkie te przykłady w wierszu poleceń.
Ale tak naprawdę, co masz zamiar do czynienia z jest Xcode.
I jeden z miłych rzeczy Xcode jest, a konkretnie w Swift,
jest to, że mamy w tym coś, co nazywa się plac zabaw.
I plac zabaw wcale app iOS.
Ale pozwala eksperymentować z Swift w bardzo łatwy sposób.
Możesz wpisać wszystkie kodzie.
To ładnie podświetlone tutaj Syntaktyka.
Podczas tworzenia nowego pliku, pojawi się pytanie Ci, jeśli chcesz stworzyć plac zabaw.
Ale Zaletą placu zabaw jest to, że po prawej stronie okna,
to właściwie pokazać, Wyjście z kodu.
Więc jeśli mogę przewinąć w dół, możemy zobaczyć, co wyjście z różnych linii kodu
rzeczywiście dzieje się.
>> Więc w tym przypadku, będziemy zmienić kierunek tylko trochę
i mówić o czymś, co jest naprawdę ważne, aby tego poziomu sposób wysokiej
że Swift działa, i to Jest to pomysł zamknięcia.
I to prawdopodobnie widziałem tego trochę w JavaScript.
Dla tych z Was, które są w CS50, zamknięcia
są bardzo popularne, bardzo dobry sposób robienia rzeczy wysokim poziomie w nowoczesnych językach.
Ale jest to również rodzaj trudne do owiń głowę po raz pierwszy.
Więc jeśli szukasz na to pierwszy raz, to jest OK.
Wystarczy spojrzeć na kod źródłowy i sprawdzić, czy można ustalić to w domu.
>> Więc w tym przypadku, powiedzmy, że mamy Aby utworzyć wiele przedstawicielek
z pewną stałą wartość.
Tak więc w tym przypadku mogę utworzyć funkcję.
Mam zamiar nazwać moc 2, którego jedynym celem w życiu
jest trochę wejście i podwójne Opisz i powrotu tej wartości.
Zauważ, że tu jestem przyjmowania jednego typu danych.
To będzie zmienną x.
To typu double.
I mam zamiar wrócić podwójnym tutaj.
A ja po prostu zrobić bardzo, szczerze mówiąc, dość
naiwny sposób na podwojenie tej wartości.
I powiem ci, dlaczego to pokazać Jest to przydatne w ciągu sekundy.
>> Zauważ, że mamy tutaj ten zakres jeszcze raz. czegoś w 1, kropka
kropka kropka, 2, co oznacza, że pętla będzie działać dwa razy.
Ale ta reprezentuje zmienną manekina.
Oznacza to, że nie jestem naprawdę będzie używać tej zmiennej w dowolnym miejscu
wewnątrz tej pętli.
Chcę tylko tej linii kodu do uruchomienia dwa razy,
bez konieczności wiedzieć wartość tego zakresu.
>> Więc w tym przypadku używam wynik razy x razy, co w istocie
Oznacza to, że jestem kwadratury tę wartość.
I to się dzieje działa tak jak oczekujemy.
Moc 2, przekazując wartość 2.0 daje nam moc 4.
3.2 Prace na 10.24.
>> Teraz możemy zrobić podobny co do mocy 3.
Ale teraz zmienić tylko zakres.
Dla manekina zmiennej w 1 do 3, pomnożyć 3 razy,
i zrobić to samo.
>> Więc to może czuć się trochę wydumane.
Ale jest ważnym rzeczą tutaj, które
jest to, że patrząc na nich dwie funkcje, nie
Tylko jedna rzecz jest inna, która to wartość w tym zakresie.
Wszystko inne na temat tych dwóch Funkcje, moc 3 i potęgą 2,
są w rzeczywistości identyczne ze względu pracują w ten sam sposób.
>> Więc w tym momencie, trochę dzwonek alarmowy powinien być schodzili.
Mam nadzieję, że to, co mówisz, wiesz, to czuje się trochę
jak powielania wysiłków.
Być może istnieje sposób, że tak będzie móc upakować wszystko
i zapewniają funkcję lub utworzyć funkcję, która
robi dokładnie to, co chcę, bez konieczności go wpisać się wyraźnie.
I to jest to, co moc zamknięcia pozwala nam robić.
Warto więc spojrzeć na to.
A ja spędzić kilka minut na to, bo to
jest bardzo ważne dla Swifta.
Widzimy to cały czas.
Jedziemy do definiowania funkcji.
To będzie się nazywać powerOf.
To będzie do zaakceptowania parametr zwany y typu int.
Ale spójrz na typ zwracany.
Typ zwracany jest w nawiasy, podwójną strzałkę podwójnym.
Co oznacza, że ​​tej funkcji, funkcja ta powerOf,
zwraca funkcję.
Że przyjmuje się podwójne i powrót podwójnym.
Tak, że może brzmieć rodzaj szaleństwa, ale niech przewinąć trochę
i sprawdź, co się dzieje.
Jesteśmy wewnątrz tej funkcji powerOf.
Tworzymy nową funkcję nazywa exponentiator,
ale to nie ma znaczenia, co to jest.
>> Zauważ, że to nie ma wartość wejściowa x.
I ma to w podwójnej i powrót podwójnym.
I jest to ten sam kod, który możemy widzieliśmy powyżej, z tym, że wartość 2
lub wartość 3, które górna granica w tym zakresie,
zastąpiono to wartość y, które
to początkowe parametry naszego funkcji powerOf.
I w tym momencie powrót exponentiator.
Wracamy funkcji.
>> To trochę jak mały umysł dmuchanie.
Ale wyobraźmy sobie, co się dzieje, gdy zgłoszę tę funkcję powerOf
i przejść do niego jakąś wartość, jak 2.
Oznacza to, że Mam teraz wartość
2 dla y, co oznacza, że ​​wartość ta y w tej funkcji exponentiator
będzie, że wartość 2.
Ale wracam to Funkcja exponentiator.
>> Tak więc zauważyć, co Swift mówi, że Stworzyliśmy w tym przypadku.
niech Plac jest definicja, to funkcja, która akceptuje podwójne
i zwraca się podwójnie.
Stworzyłem funkcji że kwadratów coś
za pomocą tego mechanizmu tutaj.
A tak naprawdę, co się dzieje jest że wraca z tej funkcji
exponentiator, ale wartość ta y jest owinięty w jej wnętrzu.
A więc teraz za każdym razem korzystać z tego zmienna lub stała ta nazywa
kwadratowe, że to będzie zachowywać jako funkcji.
I tak mogę to nazwać tę zmienną jak chciałbym wywołać funkcję,
i przejść do niego numer, jak w tym przypadku 3.
A ja wtedy pogodzić tę wartość.
Więc 3 do kwadratu będzie stać 9, jak widać tutaj.
>> Naprawdę szalone, ale to teraz pozwala mi możliwość
tworzyć inne funkcje powerOf.
Jak mogę powiedzieć, OK, dobrze teraz chcę w celu utworzenia nowej funkcji powerOf (3),
i zapisać, że w stała zwana kostka.
A teraz kostka będzie oddzielna funkcja, która będzie następnie
podjąć jakąś wartość jako wejścia i kostki, które wartość jak widać w dolnej linii
tutaj.
kostka 2 będzie skutkować 8.
>> Mam nadzieję, że całkiem miłe rzeczy.
Nigdy nie widziałem tego wcześniej.
Zachęcam do zajrzeć do zamknięcia i zbadać to trochę więcej.
To naprawdę potężne rzeczy widzimy dużo w JavaScript i innych języków.
To naprawdę ważne, aby zrozumienie API oraz
że dostaniemy w ciągu sekundy.
Tak?
>> PUBLICZNOŚCI: Kiedy robisz powerOf (2), nawias, a następnie
kolejny nawias, inny input-- jesteś w zasadzie wymiany plac.
DAN AMRMENDARIZ: Więc szukać w ostatniej linii tutaj.
To jest rzeczywiście całkowicie możliwe zrobić łańcuchowego, jak sugeruje.
Więc powerOf (5) oznacza, że ​​będziemy mieć exponentiator z 5 tutaj.
Tak to jest w istocie będzie to samo, co 4 do piątej potęgi,
bo my stworzyliśmy exponentiating funkcjonować do piątej potęgi,
i przekazujemy do że działają wartość 4.
I mamy tę wartość że oczekujemy, 1024.
PUBLICZNOŚCI: A to nie jest wymienić, więc to sprawia, że ​​łatwiej
czytać, plac cokolwiek.
>> DAN AMRMENDARIZ: Tak, dokładnie.
Zanim więc wystarczy umieścić go się tutaj tak stała
że można łatwo użyć tej nazwy.
Tak?
>> PUBLICZNOŚCI: W tym kontekście powerOf, to część
języka programowania w przeciwieństwie do sposobu
myśleć o powerOf w [niesłyszalne]?
DAN AMRMENDARIZ: Tak w tym przypadku, powerOf
jest to po prostu NAZWA Funkcja, że ​​zdefiniowane tutaj.
Więc to nie jest właściwy z samym języku
ale zamiast tego, to tylko funkcją jest
to imię, bo dam mu tej nazwy.
Jeszcze jakieś pytania?
W porządku.
>> Teraz to jest świetne.
Ale ty nie idziesz, aby zobaczyć Wiele funkcji zamknięcia, które
są jak ten, w którym określają, wewnątrz z jednej funkcji, innej funkcji.
I można to zrobić.
Ale to nie jest rodzaj naprawdę konieczne, prawda?
Jak dlaczego określenie tego Funkcja o nazwie exponentiator
a następnie natychmiast powrócić.
Dlaczego nie można po prostu od razu powrót tej funkcji?
>> I rzeczywiście, jest to dokładnie Ideą koncepcji o nazwie
anonimowe funkcje, których funkcje anonimowe rzeczywistości nie
mieć nazwę, ponieważ nie trzeba mieć.
I tak w tym przypadku, 7B możemy dokładnie to znaleźć.
To wszystko ten sam kod, robi dokładnie to samo,
ale teraz zmieniłem go lekko tak że funkcja ta powerOf natychmiast
zwraca funkcję.
Zauważ, że po powrocie, jest otwarty nawias klamrowy.
To spodziewa to wejście podwójne.
To się spodziewa, że ​​wyjście podwójne.
A potem w kluczowe oddziela sam kod.
Więc to jest anonimowa funkcja.
Faktycznie nie ma nazwy, natomiast wcześniej był nazywany exponentiator.
Ale jak widzieliśmy, tak naprawdę nie odnoszą się do exponentiator
poza tym funkcję.
Tak więc to nie miało znaczenia.
Więc to anonimowa funkcja jest tzw ponieważ jest bezimienny,
ale to nadal używany w związku z tym kodem.
>> Kolejne kilka z nich jestem mam nadzieję, że będzie w dalszym ciągu
wieje umysł trochę.
Możemy uprościć to jeszcze bardziej.
Bo jak było przenikliwie wskazano wcześniej,
Być może rzeczywiście wiemy, przez wywodząc z tego kodu, co
wyjście z tego kodu będzie.
W rzeczywistości w tym anonimowym funkcji W rzeczywistości możemy wywnioskować typy danych.
>> Więc w tym jednym, już nie Musisz zdefiniować
typ danych, który jest jest Wejście i wyjście z tej funkcji
na kilka powodów.
Jednym z nich jest, że mamy określone, w górę na Prototyp funkcji obejmujących,
jaki typ danych to anonimowych Funkcja powinna wejście i wyjście.
I z drugiej strony, że może wnioskować z kodem
tu, że przyjmujemy wejście, które jest typu Pokój
i powrót podwójnym.
>> Zauważ, że nie ma tu wyraźnie zdefiniowane nazwy argumentów
że funkcja ta przyjmuje.
I tak widzimy, możemy odnosić się do te parametry za pomocą $ 0, $ 1,
tak dalej, i tak dalej, w zależności od ilość tego parametru stosuje się
w tej funkcji.
>> To jest coś, że będzie zobaczyć wiele jest to otwarty nawias klamrowy
Definicja następnie przez $ 0, a następnie niektóre operacje,
a następnie zamknięty nawias klamrowy.
To jest anonimowa funkcja który wykonuje operację.
Ma ten parametr gdzie to typ to wywnioskować.
To pierwszy parametr jest $ 0.
A niektóre operacja jest dzieje się, że 0 $.
>> PUBLICZNOŚCI: Tak znak dolara oznacza parametr w zasadzie,
i 0 oznacza pierwszy?
DAN Armendáriz: Zgadza się.
Więc znak dolara w zasadzie oznacza, parametr, a 0 oznacza pierwszy.
Ale to działa w szczególności w w tym przypadku, w którym nie nazwali
argumenty w mojej anonimowej funkcji.
>> PUBLICZNOŚCI: Czy Perl czy coś mają to znak dolara, dolar 0 tam?
DAN Armendáriz: Czy które, przepraszam?
PUBLICZNOŚCI: Czy Perl ma to dolar 0, dolar 1--
DAN Armendáriz: Nie jestem zbyt dobrze z Perl,
ale PHP, co definiuje zmienne w oparciu o dolara.
I nie może być w niektórych językach które mają funkcje, takie jak ten.
W rzeczywistości, Swift pożycza Wiele funkcji, takich jak ten
od wielu innych językach.
Widzimy ślady Python w nim.
Ta definicja typ wydaje się pochodzić z SML.
A my mamy tylko całą masę rzeczy z wielu różnych językach.
To jedna z miłych rzeczy o Swift
jest to, że zajmuje dużo najlepszy pomysły na kilka języków
i shoehorns je wszystkie razem w jednej super języka.
W rzeczywistości, jeśli pozwolisz mi nadal wieje swój umysł,
tak robiliśmy wszystko.
Możemy być może uprości to trochę bit po sobie sprawę, że, oczywiście,
Swift ma exponentiating Funkcja wbudowany.
Jeśli importować Darwin, który jest tylko biblioteka
posiada tę funkcję o nazwie pow teraz Mogę uprościć moją moc funkcji
być następujące.
To ma być powrót to anonimowa funkcja.
>> Ale wygląda na to, jak proste jest to teraz.
Jest to funkcja, która anonimowy jest przyjęcie pewnego rodzaju danych,
i to będzie jeden Argument konkretnie,
odniesione na 0 $, które jest typu double.
To będzie powrót do typu double.
Ale instrukcja return jest niejawna.
>> I to jest dokładnie ten styl, który Jest bardzo, bardzo rozpowszechnione w Swift,
wszędzie wokoło.
Mamy zamiar zobaczyć cały czas w Swift.
Więc jestem pokazując wszystko, aby Ci z powodu tej składni.
Jest to bardzo często aby zobaczyć, co oznacza, że
jest anonimowa funkcja który jest wykonywanie
niektóre operacje na tych argumentów.
I nie jest niejawna powrotu.
Tak więc nie jest to absolutnie samo dla nas, aby powiedzieć, że to właśnie tutaj.
>> Ponieważ tego kręcone Uchwyt jest funkcja
jesteśmy wykonać tę operację na pierwszy argument.
Mamy zamiar wrócić, że.
Ale ta zewnętrzna powrót jest powrocie, że cały funkcji,
że cała funkcja anonimowa że właśnie stworzył.
Jeszcze jakieś pytania?
W porządku, nie wiem, czy jesteście na to gotowi,
ale możemy pójść jeszcze bardziej szalony z Swift.
Jesteś gotowy?
OK, to jest świetne.
>> Teraz rzeczywiście mają możliwość się w Swift, ze względu na sposób modułowy
i jak protokół oparty jest, aby definiowania własnych operatorów szalone.
Podobnie jak w tym przypadku, nie mieliśmy operator exponentiation-- dobrze,
do wykonywania uprawnień coś.
Ale może w Swift, zdefiniować nowy Operator, który robi dokładnie to.
W tym przypadku tak nie jest kilka składni tutaj.
A ja pozwalają na to patrzeć w domu, jeśli spojrzeć na to.
Ale jesteśmy definiowania tego Wrostek Operator, **, które następnie umożliwiają nam,
poprzez zdefiniowanie, co to Funkcja ** rzeczywistości
nie, zaakceptować lewą rękę z boku i prawej stronie,
a następnie wrócić wykładnik, że lewa do prawej strony.
>> I tak teraz nagle I Stworzyliśmy nowy licznik.
Tak więc 2 ** 3 oznacza 2 do trzeciej potęgi.
[Niewiarygodny SOUND], to przez Sam powinny być podobne,
OK, śruby C. będę Swift całą drogę.
To jest super.
Jest to całkiem fantastyczne.
>> Pomimo tego, że jest świetnym przykładem.
Ale ja nigdy nie raz poza w tym przypadku rzeczywiście
zdefiniowane własną operatora.
Ale nadal, to pokazuje Dużo mocy Swift
i dlaczego to jest rzeczywiście naprawdę bardzo fajne.
Ok tak?
PUBLICZNOŚCI: Jeśli jesteś Definiowanie własnego operatora,
jak wiesz, nie masz przypadkiem spróbować i stworzyć operatora, który jest
w gdzieś w C, jak ukryte gdzieś w Swift,
jak niejasne jeden, który Cię może nie widział.
>> DAN Armendáriz: Więc jeśli próbujesz definiowania własnych operatorów,
istnieje ryzyko określenia jeden na istniejącym operatora.
To idzie do poziomu szczegółowości tego Nie sądzę, że mamy czas, aby przejść na drugą.
Ale to jest ryzyko.
I to jest w rzeczywistości bardzo dlatego Nie używać symbolu daszka, który
kiedy piszesz na siłę, zwykle używać 4 mały daszek 5 lub coś
tak, po prostu, gdy jesteśmy Gchatting kumpli lub cokolwiek.
Jednak w tym przypadku, że w rzeczywistości spowodowała kolizję.
A więc unikać go tylko dlatego, Zdarzyło mi się wiedzą w tym przypadku
że spowoduje to kolizji.
>> W porządku.
Teraz, niestety, na ostatnie siedem minut,
Muszę zachować dmuchanie wasze umysły trochę.
Więc pozwól mi pokazać, kilka innych rzeczy, jak również.
>> Pokazaliśmy wam ten pomysł o tych anonimowych funkcje,
Zamknięcia te, które pozwalają na rodzaj przekazać funkcje wokół.
Możesz je zwrócić.
Można nimi manipulować.
Możesz zrobić wszystkie rodzaje szalonej rzeczy.
>> Ale jedna rzecz, że okazuje się być przydatna
ma zdolność, w przeciwieństwie na powrót tych funkcji
w funkcji, aby przekazać funkcję jako parametr do innej funkcji.
Można się dobrze myśleć, dlaczego na Ziemi chciałbym zrobić coś takiego?
>> Cóż, powiedzmy, że chcę skorzystać z operatora, że
tak ciężko pracował, aby utworzyć i zastosować to na kilka różnych numerów
w tablicy.
Więc w tym przypadku mam tablicę integers-- 1, 4, 7, 2, 5, 10, 56.
I chcę je wszystkie podwoić.
Sposób, że będzie zazwyczaj zrobić, to po prostu napisać
prosty dla pętli, które iteracje wszystkie z nich
i wykonać jakąś plac praca nad nimi,
wprowadzeniu tych nowych wartości do nowego zmienna, a raczej nową tablicę tutaj.
A wartość wyjścia Efektem jest to wszystko z tych tablic,
albo raczej tych wszystkich Elementy teraz do kwadratu.
>> I możemy zrobić to samo rzeczą dla organizowania kostek go,
ale trochę dzwonek alarmowy powinny być schodzili
mówiąc, że może jest jakiś sposób, że będzie
możliwość uproszczenia tego trochę.
A w rzeczywistości nie jest.
Co zrobić, jeśli możemy stworzyć funkcja, która pozwala nam
do przyjęcia, jako drapieżnik, funkcji?
Tak więc w tym przypadku wziąć spojrzeć na te argumenty.
Zamierzamy przyjąć listę deblu.
A potem idziemy przyjąć funkcję
w zmiennej o nazwie f, który ma wziąć podwójną i powrócić podwójnym.
I cały wyjściowy całej tej funkcji
nazywa mapowania będzie zwrócić tablicę o nazwie dwukrotnie.
>> Co by to wtedy pozwolić mi nie jest iteracyjne nad tym liście
i zrobić to samo, ale teraz stosować tę funkcję na każdym
poszczególnych wartości w tym wykazie.
Tak naprawdę nie wiem, co f jest.
To nie ma dla mnie znaczenia.
Ale tak długo, jak to ma w pokoju dwuosobowym, wykonuje jakąś operację na niej,
a następnie zwraca Podwójne, chciałbym być następnie
w stanie przyporządkować tę funkcję w całej każdy element listy.
>> I tego typu programów jest zwane wyższe funkcje zamówień,
gdzie przekazujemy funkcje wokół jako parametry
i robi rzeczy z funkcji.
To trochę jak przy wszystkich tych pomysły, które nauczyliśmy się CS50
i biorąc je sortowania od do następnego poziomu.
A to wszystko w stylu CS51 rzeczy.
I tak idziemy w głąb więcej w zajęciach takich jak to.
>> Jednak jest to także Ważne tutaj, ponieważ
zobaczyć wiele funkcji które są wykorzystywane w Swift
że w istocie nie tego, gdzie mamy
niektóre numery, niektóre tablicę liczb.
Mamy zamiar przekazać, że Tablica do naszego odwzorowującym.
I my również będzie przekazać jakąś funkcję, która
mamy już zdefiniowane tutaj.
To będzie kwadratowych.
I mamy zamiar to pogodzić wszystkie te numery
i zapisać, że do tego wyniku tutaj.
>> Więc w tym przypadku mamy zdefiniowane nasze własna funkcja nazywa mapowania.
Ale dokładnie to jest to, W rzeczywistości, wbudowany Swift.
Istnieje różnorodność funkcje zwane map.
Jest to funkcja map, istnieje funkcja redukcji,
i tam jest funkcja filtrowania, które zasadniczo zastosowanie funkcji
do każdego elementu w listy zmodyfikować je w jakiś sposób.
>> PUBLICZNOŚCI: Więc skoro zmieniają dane na inny format
przez function--
DAN Armendáriz: Racja.
Tak, więc funkcja że mamy do zaakceptowania
przekształca dane w jakiś sposób.
W tym przypadku były albo kwadratury, albo byliśmy organizowania kostek go,
czy naprawdę, możemy wykonać żadna operacja na nim w ogóle.
>> Ale pozwól mi to pokazać, jak to będzie wyglądać w praktyce.
I znowu, Używam nieco czasu. więc nie jestem
będzie w stanie przejść nad wszystkim kodu źródłowego w szczegółach.
Ale zachęcam, aby to zrobić.
Będziemy pisać ją jak najszybciej możliwe po tej rozmowy.
>> Ale jeśli spojrzeć na to, Zakładamy, że mamy listę numerów,
tablica liczb w tym Zmienna numerów.
Następnie chcemy wykonać to Działanie filtra na tych liczb.
Tak więc filtr jest większa Funkcja nakazanie
akceptuje tablicę, a także funkcji.
I na każdym elemencie, w które tablica, wykonuje tę funkcję.
>> Jeśli ta funkcja zwróci prawda, utrzymuje tę pozycję.
Jeśli ta funkcja zwraca false, rzuca się ten element.
A następnie zwraca listę który jest następnie całą
z tych elementów, które zostały odfiltrowane.
>> Tak, innymi słowami, to jest ten sam pomysł, dziennik ocen.
Możemy mieć różne stopnie w tym wartości numerów.
Może być 100, a 70 i 40, tak dalej, i tak dalej.
Co ten filtr nie jest zawiadomienie że jest to, że cukier syntaktyczny
anonimowego funkcji.
To jest anonimowa funkcja mówiąc że parametr, który mam akceptując
będzie, jeśli to jest większa niż 70,
to ta zwróci true, co oznacza, że że element będzie przechowywany w tym filtrze.
Warto więc być trochę więcej betonu o tym.
Jeśli mam tej tablicy liczb i składa się z 100, 70, i 40,
Wykonuję ten filtr Działanie na każdym z nich.
Tak, że pierwszy z nich jest to wartość 100.
100 większa niż lub równa 70 jest prawdą, która
Oznacza to, że 100 jest utrzymywany w ta nowa kopia tej tablicy.
70 również przechodzi.
Ale 40 nie.
Więc co jest zwracany w passingCount jest tablica elementów 100 i 70--
100, przecinek, 70.
To były tylko dwa przedmioty, które nie weszły.
A więc powodem, szybko przeszedł dużo tego rodzaju wysokiej klasy
rzeczy, ponieważ jest to, że wspólne rzeczy, które można zobaczyć w Swift dość
często, pewnych operacji Korzystając z tej funkcji anonimowych składni.
>> Jest trochę fajnych rzeczy.
Przełączniki są naprawdę potężny w Swift, Chodzi mi o to jak szalony, szalony potężny.
Możesz użyć przełącznika, a rzeczywiście można je stosować
do zakresów, które jest rodzajem szaleństwa, i zrobić wymyślnych rzeczy w tym stylu.
>> Jednak w ostatnich kilku minutach Chcę przejść od razu dość daleko
i pokazać konkretny przykład, jak możemy stworzyć w iOS aplikacji za pomocą Swift.
Więc kiedy robisz tego, będziesz musiał podjąć
Spojrzenie at-- na Apple dokumentacja, że
dużo naprawdę dobrych tutoriali za stworzenie pierwszej aplikacji.
I zachęcam was do zrobienia że dlatego, że cię
przez wszystkie etapy tego, co dokładnie kliknij, aby stworzyć aplikację dla systemu iOS.
>> Ale tutaj mamy aplikację dla systemu iOS.
I to jest dość prosta aplikacja naprawdę.
Jeśli uruchomię to, pozwól mi pokazać Ci, jak to wygląda.
Wszystko to w zasadzie nie jest to ściąga z internetu akta JSON
że są zapisywane na serwerze.
I że plik JSON definiuje obrazów, które pozwalają
mi to przechodzić, na moim aplikacja, obrazy z mojego serwera.
>> Więc mam tutaj getNextImage.
Ładuje obraz z Internetu, a następnie wyświetla je na ekranie.
>> Więc jest to bardzo proste.
Ale celem jest, aby pokazać w jaki możemy łączyć rzeczy
z ostatnich kilku tygodni CS50 w rzeczywistej aplikacji iOS.
Innymi słowy, być może jednym z rzeczy, które warto robić
jest posiadanie aplikacji na iOS, które może pobierać dane z internetu
i pokazać użytkownikowi informacje.
To jest całkowicie punkt tego kodu źródłowego tutaj.
>> Więc nie ma wiele do powiedzenia na temat jak zrobić rzeczywistego rozwoju iOS.
Istnieje wiele szalony składni że zupełnie nie widziałem jeszcze
jak klasy, co klasa rzeczywistości.
Możemy w dużym stopniu ignorować że w chwili obecnej.
>> Ale zauważmy, że mamy zawarte W ramach tego wiele rzeczy
które widzieliśmy już jak funkcje, które mają konkretne nazwiska.
A kiedy dajemy ci Funkcjonuje poprawne nazwy
które są oczekiwane przez iOS, w rzeczywistości to czuje się trochę magiczne.
Ale podczas tworzenia Aplikacja iOS, nie
szczególne nazwy funkcji, które nazywane są przez sam telefon
jako aplikacja się ładuje, aby spróbować stworzyć proces faktycznie
uruchamia aplikację.
Więc jeszcze raz, jest wiele rzeczy, które ja muszą tuszować tutaj, aby nas
mówić o tym specjalnie.
Ale zachęcam do obejrzenia może drugie seminarium iOS, ale także niektóre
z samouczki online, które robią o wiele lepiej opisywania
konkretne informacje.
>> Ale możemy zobaczyć kilka rzeczy, które są interesujące z kodu tutaj.
Zauważ, że jeśli mamy sprawozdania.
Dzięki temu jedna ważna rzeczą, jeśli sprawozdania
jest to, że nawiasy wokół Wyrażenie logiczne są opcjonalne.
Ale nawiasy klamrowe nie są obowiązkowe, bez względu na to, jak kilka lub wiele linii kodu
masz w instrukcji if.
Nie możesz mieć, jeśli sprawozdania bez nawiasów klamrowych w Swift.
>> I to jest, dobrze, rodzaj głupie.
Ale nie ma powodów historycznych dla tego.
To ma zaoszczędzić od siebie.
Jak to na przykład, nie można wyeliminować nawiasy klamrowe wokół, że
if.
Te są rzeczywiście potrzebne.
Więc zachęcam do spójrz na to.
Ale jest jeszcze jedna budowy, że chcę
aby pokazać wam o Swift, że jest nowy Swift 2.0 w porównaniu
do starszych wersji Swifta, który jest następujący.
Zobaczmy, gdzie mogłem umieścić go tutaj?
>> Więc w tej funkcji o nazwie fetchJSON, funkcja ta
jest odpowiedzialny za ciągnięcie tego JSON plik z adresu URL, który tak się składa,
być uruchomiony na moim CS50 IDE.
Właśnie rozpoczął Apache, umieścić mój plik JSON tam,
i jestem w stanie to pociągnąć, że danych z Internetu za pomocą
funkcja i to URL, dostarczanej przez telefon.
To pod warunkiem przez biblioteki, które używasz, kiedy
robisz jakiś iOS app rozwoju.
>> Zauważcie, że nie jest to niezwykłe syntaktyczna konstrukcja nazywa strażnika.
A tak naprawdę to wszystko jest w Swift jest sposobem weryfikacji
że niektóre rzeczy mają zostały spełnione przed tobą
przystąpić do reszty funkcji.
Więc mogę mieć, używając Ten opcjonalny rodzaj,
Mogłem znaleźć adres URL przez uruchomienie tej funkcji bibliotece NSURL
i przechowywania, które w adresie URL stała, a następnie sprawdzanie
aby sprawdzić, czy adres URL była zerowa, ponieważ to zamierza powrócić opcjonalnego typu.
A jeśli to była zerowa, to bym wydrukować błąd i potem wrócić.
>> Ale zamiast tego, co strażnik pozwala nam robić to, że właśnie to,
ale upewnij się, że jest rzeczywiście zdarza się, że adres URL
został prawidłowo ustawiony przez bibliotece NSURL.
A jeśli jest, to pomija to, i to
będzie można kontynuować url które zostały właściwie określone.
Ale czy to jest tak, że url nie jest poprawnie zdefiniowana,
jeśli ta funkcja zwraca błąd lub inne nieoczekiwane rzeczy
rzeczywiście występuje, to straż konstrukcję pozwala nam to wyjście tego błędu
i powrócić natychmiast.
Tak?
>> PUBLICZNOŚCI: Więc jest to rodzaj jakby if czym jeszcze?
DAN Armendáriz: To trochę jak if wtedy jeszcze, tak,
chyba że ten adres url jest następnie zdefiniowane na wszystko poniżej tego.
Jeśli przechodzi tę osłonę, a następnie go faktycznie zostaną wypełnione danymi
używane w pozostałych Kod źródłowy w swojej funkcji.
Więc podejrzewam, że masz zamiar rozpocząć, aby zobaczyć ten strażnik, jak również.
I mieć na uwadze, że.
>> Więc po prostu patrząc na kilka innych rzeczy, to właśnie tutaj jest co,
myślisz, tylko w oparciu o to, co rozmawialiśmy o tym wcześniej?
>> PUBLICZNOŚCI: Myślisz, że działają w liście?
>> DAN Armendáriz: Więc to jest blisko.
Jest to funkcja, które są ograniczające.
A my wprowadzania tej funkcji jako argument tej funkcji tutaj.
>> PUBLICZNOŚCI: [niesłyszalne], jeśli nie zerowe.
Więc to jest na liście, prawda?
>> DAN Armendáriz: Jeśli błąd nie jest zerowa, tak, że jest-- więc muszę przewijać.
Cóż, zobaczmy, nie mogę naprawdę Przewiń w prawo, tutaj.
Błąd jest argument, który jest przekazywane do tej anonimowej funkcji.
To jest anonimowa funkcja.
To nie ma nazwy.
Ale przyjmujemy te trzy argumentów, danych, odpowiedzi i błędów.
I to będzie powrót nieważne, więc to nie będzie powrotu nic.
I to jest zawartość z tej funkcji.
I wtedy mamy dostęp do wnętrza, które Funkcja każdego z tych argumentów.
>> Więc to trąba powietrzna Zwiedzanie języku.
Ale mam nadzieję, że z tego, mam nadzieję, że jak wziąć
spojrzenie na niektóre z ćwiczeń specyficzne dla rozwoju iOS z Swift,
zwłaszcza jeśli idziesz do Web developer page-- Apple
mają wiele naprawdę dobry tutoriale, aby zacząć grę.
Ale miejmy nadzieję, że tylko ten godzina rozmowy o składni sam dał
jesteś na tyle, aby zacząć z tym.
>> Będziemy pisać wszystkie te źródła Kod na stronie internetowej seminarium
tak szybko, jak to możliwe, a także slajdy więc masz punkt odniesienia dla wszystkich tych.
Ale powodzenia projektów.
I dziękuję wszystkim bardzo za przybycie.
>> [OKLASKI]