[השמעת מוסיקה] דן AMRMENDARIZ: כולם, ברוכים הבאים לסמינר CS50, iOS App פיתוח עם סוויפט. אני דן Armendariz, ואני מוֹרֶה של מדעי מחשב, כאן בהרווארד. והשעה הקרובה הולכת להיות סיור מערבולת של כמה שיותר דברים על נושא זה כפי שאנו יכולים להתאים. אני אפרסם את כל קוד המקור שאתה רואה היום באינטרנט. אנחנו אולי לא נוכל בעצם ללכת על הכל שאני שאני מראה לך בשעה זו. אבל לפחות אני מקווה שדרך ההערות של קוד המקור, תוכל לנסות להבין מה בדיוק קורה לדברים האלה כי אנחנו לא די להגיע ל. בסך הכל, את המבנה של השיחה של היום תהיה כדלקמן. נתחיל את עושה קצת בסיסי תחביר בשפת סוויפט, הולך לחלק ממתקדם יותר תחביר של שפת סוויפט. בגלל השפה הוא באמת מודרני ו יש הרבה ברמה הגבוהה תכונות, דברים שיש לנו לא ראה בC ברחבי CS50, או אפילו כמה שפות האחרות שאנחנו כבר התחלנו באמצעות בCS50 כמו PHP, אז אני הולך לצריך לנסות להציג גם כמה נושאים ש קשורים לשפות ברמה גבוהות יותר שייתכן שלא תראו בעומק בCS50, אבל אתה תראה בהמשך כיתות מדעי מחשב. אז זה הולך להיות צפוף שעה. ואל תהסס לתת לי יודע אם יש לך שאלות. אז אם אתה מעוניין בעושה פיתוח עם סוויפט, או באמת כל פיתוח אפליקציה iOS, יש כמה דרישות. קודם כל, אתה צריך להיות באמצעות מק, פועל בדוגמאות שאנחנו הולכים להיות באמצעות היום, גרסה חדשה יחסית של מערכת הפעלה X. במקרה זה, אני רץ X 10.5. אתה יכול להיות ריצת 10.11 אם אתה רוצה. אבל כל מה שאתה הולך רואה הוא מעורב 7 Xcode ומאוחר יותר, שבו יש את הגרסה האחרונה של סוויפט, שהוא 2.0 סוויפט. זהו למעשה די הבחנה חשובה. הרבה התחביר יש השתנה באופן משמעותי למדי בחלק ממקרים מסוויפט 1.0, ששוחרר בשנה שעברה, 2.0 סוויפט, ש רק יצאתי בסתיו קרוב. אז אנחנו הולכים להראות סוויפט 2.0. הרבה מהדברים ש אתה מחפש באינטרנט כאשר אתה מנסה להשיג נוסף מידע על מגוון רחב של דברים, ייתכן שתרצה באופן מפורש לחפש את סוויפט 2 ולא סוויפט פשוט ישן לעשות בטוח שאתה מקבל נכון התחביר. למעשה, זה בדרך כלל נכון. יש כמות מהירה של פיתוח קורה בשפת סוויפט מאז אפל פרסמה את זה, אני חושב ש מה, זה היה קצת יותר משנה עַכשָׁיו. ודברים השתנו באופן דרמטי בזמן הזה. וכך לא להיות מתוסכל אם, כאשר אתה מסתכל מסביב לנושאים על סוויפט או איך להשיג משהו באמצעות כמה דוגמא קוד או משהו שזה לא ממש לעבוד על סוויפט 2.0. ודא שאתה מחפש במיוחד עבור גרסה ש כדי לנסות למזער את ההשפעות של שונה גרסאות ואלה מיני דברים. אני אנסה להצביע רק כמה דברים כי הם שונים לגרסאות ישנות יותר. אבל זה משהו שצריך להיזהר. זה כנראה הולך להיות אחד מכאבי הראש הגדולים ביותר שיהיה לך עם סוויפט הוא מציאת דוגמא קוד שהוא מבוגר, אפילו רק בכמה חודשים, מנסה להשתמש זה בפרויקט המודרני יותר שלך. וזה פשוט לא עובד. אתה מקבל שגיאות מהדר, תחביר טעויות, כל מיני דברים מטורפים. כל כך פשוט להיות סבלני עם זה, ואתה יהיה בתקווה יש ניסיון די נחמד עם כולל סוויפט. עכשיו אתה באמת יכול join-- ואני מקווה ש עדיין יש לנו בעצם year-- זה זה האפליקציה של אפל CS 50 צוות פיתוח, ש יאפשר לך להתקין את כל יישומים שאתה יוצר במכשירי iOS שלך. אז תסתכל על כתובת אתר זו אם אתה מעוניין בכך. אז רק כמה דברים על סוויפט עצמו. זוהי שפה שנאספה. אבל אתה תראה שחלק של התכונות שאנו משתמשים בי לאפשר לו לשמש גם בקצת כמו פירש דרך גם כן. הרבה התחביר מושאל מג הוא מבוסס ונכתב בג וכך אנו רואים ש יש הרבה של מזון מהיר מהידע הקיים שלך מC שאנחנו יכולים יציאה לסוויפט. אבל יש דברים ש לעשות את זה שונה מאוד מג זה מאוד מאוד הקליד. יש ניהול זיכרון אוטומטי. אתה לא תצטרך להשתמש malloc או בכל מקום בחינם. זה מיועד לכלליות. אז במילים אחרות, אתה יכול להשתמש בו ב כל מיני הקשרים, מבית Apple הצפייה ל- iPhone כל הדרך עד לOS X, ו אפילו כמה שרתים, אפילו כמה scripting. אבל נראה ש התמיכה scripting לא ממש שם עדיין כ זה בשפות אחרות. אז ככל הנראה תהיה באמצעות זה אך ורק לפיתוח ב- Mac שלך או iPhone שלך. ויש לו הרבה תכונות מודרניות. והרבה מהדברים האלה הם דברים ש אנחנו הולכים לנסות לטפל היום, אבל גם הנושאים שלנו, כי בכנות, אנחנו יכולים להקדיש את כל הקורסים. למעשה, CS 51, שהוא הסמסטר הבא מוצע, מתמקד הרבה בנושאים אלה שיתואר להלן. אז אתה יכול להשקיע כל סמסטר הבנת הדברים האלה. אבל אנחנו הולכים לנסות לעבור אותם מספיק לפחות ש יכול להבין מה זה קורה כאשר אתה מסתכל בתכנית סוויפט ולהיות מסוגל לפרוץ את הדרך שלך דרכו לפרויקט הגמר. עכשיו אחת הדרכים הטובות ביותר שאתה יכול לקבל מידע נוסף על זה הוא בכנות פשוט דרך אפל של סיפק תיעוד לסוויפט. יש הרבה של APIs שזמינים. וזה בסיס טוב לביתך לחפש, דברים ספציפיים שאתה רוצה לעשות עם ה- API מעורב iOS. אם אתה רוצה להשתמש במצלמה ל למשל, אתה יכול להתחיל לחפש כאן, וגם להשתמש ב- Google וסטאק גלישה באופן רגיל. כל שאלות על זה לפני שאנחנו קופצים תקין ב? בסדר. בואו נעבור הלאה. אז קודם כל, יש לי מספר קבצי דוגמא. ואני הולך לנסות לשלב דרכם במהירות יחסית. זהו קובץ שלום העולם לסוויפט. זה פשוט מאוד. יש דרך נוספת הערות מ יש קוד בפועל. שים לב לקוד בפועל הוא ב מאוד תחתון בקו 14. זה אומר הדפסה. ואז זה קריאה לפונקציה. אנחנו עוברים אליו מחרוזת נקראת cs50 שלום. שים לב שאין נקודה-פסיק. שים לב שאין עיקרי int. יש אף אחד מ קראפט שהיה לנו עם ג כאשר אנו משתמשים בסוויפט בדרך זו, שרק כתובה בקובץ טקסט ומאוחסן במחשב שלי, אז אני יכול לקמפל אותו ולהפעיל אותו. שים לב שאני כאן לא באמצעות IDE CS50. זאת בהנחה שאני ריצה ושאני על OS X, וכי יש לי Xcode כבר מותקן במחשב זה כדי שזה בעצם פונקציה. אבל זה רק קובץ טקסט רגיל כי אז אנחנו יכולים ללקט ולערוך. אז בואו לראות איך זה באמת עובד. מה אם אני רוצה לקמפל את זה? 1.swift swiftc. אחרי רגע או שתיים, זה יראה שיש לנו עכשיו הידור זה לקובץ בשם 1. ועכשיו יש לנו מודפס CS50, יישום שלום העולם שלנו ולא. שים לב דבר אחד אחר כ גם הוא כי כברירת מחדל, לא היה לנו לקלט / n להדפיס קו חדש. כברירת מחדל, פונקצית ההדפסה ב סוויפט יודפס שורה חדשה בשבילך. אתה יכול לעבור נוסף אופציונאלי פרמטר לספר אותו שלא לעשות כן. אבל גוגל לקבלת מידע נוסף על זה. כברירת מחדל, זה יעשה את קו ההדפסה. בסדר, אז בואו נעבור על אז לכמה דברים אחרים. אז איך אנחנו יכולים למעשה להגדיר משתנים? אנחנו יכולים לעשות את זה באמצעות אחת משתי שיטות. ואת זה אני רוצה להגיד לך על הגדרה ראשונה הוא לתת לזה. וזה חשוב בגלל יעילות מה שאנחנו עושים הוא הגדרה קבועה. אנחנו הולכים ליצור משתנים, או לייתר דיוק שם נקרא קבוע, לספק לה כמה data-- ב מקרה זה, את המחרוזת דן. אבל באמצעות לתת לזה מילת המפתח, אנחנו אומרים כי זה variable-- או שוב constant-- נקרא שם אף פעם לא הולך להיות שונה. זה הולך להיות בלתי ניתן לשינוי בכל משך תכנית זו או בכל משך ההקשר שמשתנים כי הוא זמין. זה באמת חשוב שכאשר יש לך כמה נתונים שאינם הולך לשנות בתכנית שלך, ותראה מגוון רחב של דוגמאות מתי אנחנו רוצים להשתמש תן לעומת התחביר האחר, זה חשוב כי אתה משתמש בוא בכל מקום אפשרי, כי זו תודיע השפה שזה לא הולך להיות שונה, וזה באמת יכול לבצע הרבה אופטימיזציות כדי לשפר את המהירות ו הבטיחות של התכנית שלך. ועל ידי בטיחות, אני מתכוון לא נותן לי התרסקותו עם טעויות מטורפות שאולי רגיל לראות בג אז אנחנו יכולים להשתמש באינטרפולציה המחרוזת כדי לתמצת את זה במחרוזת. אז אנחנו יכולים לראות בזה קו הדפסה, להדפיס שלום, ולאחר מכן באמצעות סימני פתח סוגר קו נטוי, ולאחר מכן את השם שלי משתנה, במקרה זה קבוע, לסגור את הסוגריים. אני בעצם לאחר מכן לשים תוכן של שם משתנה בשם זה בתוך המחרוזת ולאחר מכן הדפסת התוצאה שם. יש שינוי אחר אחד בקובץ זה והוא שיש לי, בחלקו העליון, להכניס לקו עֵסֶק, ש בעצם רק מציין כי אני רוצה להשתמש ב מתורגמן סוויפט, ש משמעות הדבר היא שאני כבר לא צריך לקמפל תכנית מסוימת זו. אני רק יכול להפעיל אותו כמו תסריט משלו. אבל זה, במקרה הזה, מאחורי הסצנות שלוקטו ולאחר מכן להיות ארוך. זה פשוט בלתי נראה לנו. בסדר, אז בואו נמשיך הלאה. אז יש קצת תחבולות שרק קרו בעבר. הראיתי לך אני ש יכול להגדיר קבוע. ואני יכול לספק כמה נתונים לעשות את זה. אבל במקרה הזה, שם לב שאני לא למעשה לציין את סוג הנתונים שזה. וזה בגלל ש מהדר, סוויפט יכול להסיק את סוג הנתונים מבוסס רק על נתונים שאני מכניס אותו. כי הוא יודע שעל ידי הערכה זו משתנה ממש כאן, ממש נתונים זה כאן, הוא יודע שזה הוא מחרוזת. ולכן שם קבוע זה הוא אפוא הולך להיות מחרוזת, כמו גם. אבל אנחנו גם יכולים להיות מפורשים על הסוג זה אנחנו הולכים להשתמש ל קבועים או משתנה על ידי שימוש בתחביר זה instead-- בואו מחרוזת שם מעי גס שווה דן, אשר במקרה זה אומר שאנחנו הולך להגדיר שם בשם קבוע. זה הולך להיות מטיפוס String. והערך הולך להיות דן. עכשיו הדרך אחרת ש אנחנו יכולים ליצור variables-- ואלה הם משתנים משתנים, ש משמעות הדבר היא שאנחנו, למעשה, הולכים כדי לשנות את תוכנם מתישהו במשך ההקשר שמשתנה שdefined-- להשתמש במילת מפתח var במקום לתת. אבל שוב, כברירת מחדל, אלא אם כן אתה יודע כי אתה צריך לטפל נתונים ש, מנסה להשתמש תן ל שיפורי ביצועים. במקרה זה, אז אני יכול לציין את סוג הנתונים שאנו מצפים להיות בתוך משתנה זה חדש בשם תווית. זה הולך להיות מחרוזת. ואז אנחנו הולכים ללשרשר יחד שתי מחרוזות, מחרוזת שלום, והמחרוזת מיוצגת על ידי משתנה, או לייתר דיוק את השם הקבוע. אז זה נחמד כי זה הוא קצת PHP כמו בנו ש יש שרשור מחרוזת קל מאוד. אין לנו באופן אוטומטי להשתמש בכל סוג של ניהול זיכרון כדי להגדיל את הגודל ולעשות כל סוג של דברים מצחיקים שיש. זה עובד כפי שהיינו מצפה דווקא. בסדר, שאלות על זה? עכשיו הסיבה אחרת ש אנחנו צריכים יש לך את היכולת כדי להיות מסוגל להגדיר מה סוג של משתני הנתונים הוא כי לפעמים אנחנו עושים לא רוצה לאתחל משתנים עם כמה נתונים ב נקודה של הגדרה. אז במקרה הזה, נניח כי אני רוצה להתחיל המזינים כמה ציונים לספר בכיתה. ובכן, אני יודע שאחד מ משתנים שאני רוצה להיות הולך להיות בכיתה משתנה. ואנחנו גם יודעים שאנחנו רוצה שזה יהיה מספר שלם. אבל אולי אנחנו עושים עדיין לא יש כיתה שזמינה. בסוויפט, שיש לך מגדיר את סוג הנתונים המשויך ל משתנה או קבוע לתת לפני למעשה אתה יכול להשתמש במשתנה ש. בגלל זה הוא מסוג חזק, אתה צריך לשייך סוג עם המשתנים הללו. אז במקרה הזה, אם יש לי לא כראוי אותחל הראשון עם ערך כלשהו, אז אני צריך לספר מה סוויפט אני מצפה לסוג הנתונים להיות. וזה הולך להישאר שאותו סוג הנתונים לאורך ההיסטוריה של תכנית זו. עכשיו אתה עשוי להתפתות בהקדם אני יצרתי משתנה כיתה זו ובלבד ש מספר שלם של 100, עכשיו אם אני רוצה לנסות לשרשר מחרוזת עם מספר שלם ש, עשוי להתפתות עדיין להשתמש שמפעיל שרשור מחרוזת כמו שעשינו רק כמה שורות לפני. אבל לרוע המזל, למעשה זה לא יהיה לעבוד, בגלל שאתה בעצם ביצוע ניתוח בשני סוגים שונים. עכשיו זה שונה מאוד מאחר שפות כמו PHP שהם באמת Goosey loosey עם הסוג של סוגיהם. הם פשוט אוהבים, כן, מה, לא אכפת לי. רק תן לי סוג אחד, ו אולי אני אעשה את הדבר הנכון. במקרה זה, סוויפט הוא מאוד קפדן על הסוגים שיש לך עסק. מפעיל סיכום זה או מפעיל שרשור יש בעצם שני אופציות אפשריות שונות. אתה יכול לעשות את סיכום עם מספרים שלמים, או שאתה יכול לעשות שרשור מחרוזת, ו אולי כמה דברים אחרים גם כן. אבל אם המפעיל שאינו מכיר מה הוא משני צדיו, או לייתר דיוק השילוב של אלה שני סוגים, זה לא מה שמצפה, אז זה הולך לגרום לכישלון. אז במקרה הזה, מה זה אומר יש מחרוזת בתוספת מספר שלם? ובכן, בהקשר של זה, אנחנו כנראה רוצים לעשות פעולת שרשור מחרוזת. אבל כמובן המחשב אין סוג כזה של קשר. ולכן אנחנו צריכים לספק כי מידע נוסף לתת לו יודע מה זה הוא שאנחנו רוצים לעשות. אז במילים אחרות, העובדה שסוויפט הוא מסוג חזק אומר שאתה צריך לעשות קצת עבודה נוספת כדי לקבל אותו לפעול דרך שאתה רוצה. אבל כתוצאה מכך, זה בטוח יותר. וברגע שיש לך לקחת בחשבון סוגים אלה, דברים רק בכנות להתחיל לעובד די טוב. אז במקרה הזה, אז אנחנו הייתם לבצע שרשור מחרוזת על ידי במפורש ליהוק המספר השלם למחרוזת על ידי לפפה אותו בזה הון פונקצית S מחרוזת, ולאחר מכן באמצעות שרשור המחרוזת מפעיל לשנות משתנה התווית שלנו, ואז להדפיס אותו. בינתיים בסדר? בסדר, בואו תמשיכו הלאה. עכשיו יש מגוון של נתונים סוגים שאנחנו יכולים להשתמש בסוויפט. כפי שאתה התרגלתם, אנחנו יכולים ליצור מערך משתנה. ומערך שרק יכול מכיל סוג אחד. אז במקרה הזה, אנחנו הולכים ליצור מערכים משתנים של מספרים שלמים, ש אנו קוראים לציונים, ונוכל לאחסון שבסוגריים מרובעים זה פורמט כמו שהתרגל במגוון רחב של שפות אחרות. אבל שם לב שכאן אנחנו הגדרה כמה דברים. ציונים הוא variable-- משתנה אנו לא להשתמש במילת המפתח בואו. אז זה אומר שאנחנו יכולים לשנות ולאחר מכן התוכן של מערך זה. זה של Int מערך הסוג, ואנחנו יכולים להגיד ש המבוסס על סוגריים מרובעים אלה כאן. עכשיו אחד הדברים נחמדים על זה הוא שאנחנו ש יש להם גישה להרבה מידע נוסף על המערך רק באמצעות כמה סימון נקודה פשוט. כך למשל, grades.count מספק לנו מספר הפריטים שקיימים שב מערך, שאותם אנו יכולים לגשת די בקלות פשוט באמצעות שסימון הנקודה. אם ברצונך להוסיף נוסף פריטים למערך זה, אתה לא יכול לעשות את סגנון PHP שבו אתה רק במפורש להגדיר, במדד נתון, ערך כלשהו שברצונך להוסיף. במקום זאת, השתמש צרף שיטה בסוג המערך לצרף פריט ש, 95, לרשימה זו. אז עכשיו מערך זה יש הבא contents-- 100, 0, 90, 85. ועכשיו אנחנו כבר צירפנו 95 גם לזה. יש דרכים אחרות אנחנו יכולים לצרף את הדברים. למעשה אתה יכול להשתמש מפעיל סיכום, שיתפרש כ פעולת צרף מערך. ואז אתה יכול לצרף עוד מערך, תוכן שהם 70 ו -80, למערך זה. אז עכשיו יש לנו את תוכן במשתנה זה grades-- 100, 0, 90, 85, 95, 70, ו -80. זוהי רק תחבירית קטנה ונחמדה סוכר שסוויפט מספק לנו. אז אם אנחנו רוצים לסכם ציונים, אנחנו אולי הולך רוצה לחזר על כל פריט בלולאה זה. ויש לנו, בסוויפט, הרעיון של ללולאה כפי שהיית מצפה. אבל האופן שבו אנחנו מצביעים מגוון הוא מעט שונה. אז במקרה הזה, ל סיכום הכל, אנחנו הולך ליצור זמני סכום משתנה בשם על מנת ש כדי לשמור על ספירה זו. ושים לב לנו בניית לולאה כאן. למדד ב0 ..