
mock_data.json בפרויקט חדש, וגוררים אותו לפרויקט עם אפשרות ההעתקה.Place מכיל latitude ו-longitude (Double) ישירות במקום ב-geometry ו-location, icon, id, name, placeID, types (מערך של String) ו-vicinity. השדה openNow הוא Bool אופציונלי במקום קונטיינר opening_hours, ו-photo הוא אובייקט אחד במקום מערך, כי במערך תמיד יש תמונה אחת.Photo עם height, width ו-ref. ה-enum CodingKeys ממפה את ref לשם photo_reference ב-JSON.Places עם מערך places, שהמפתח שלו ב-JSON הוא results.Decodable ב-extension: מגדירים CodingKeys שכוללים גם את המפתחות של geometry, location, opening_hours, open_now, place_id, lat ו-lng, ואז כותבים init(from:).icon, id, name, placeID, types, vicinity נשלפים ישירות מה-container. את התמונה לוקחים מאיבר 0 של מערך photos.opening_hours חסר בחלק מהמקומות, ולכן מנסים לקבל את ה-nested container עם try? ואת open_now בהמשך, עם try? גם כן. כשהקונטיינר חסר, הערך נשאר nil.geometry ל-location ורק אז lat ו-lng, באמצעות nestedContainer פעמיים.readPlaces קוראת את הקובץ, ו-JSONDecoder מפענח ל-Places. ההדגמה משתמשת ב-try! כדי לראות איפה הקוד נופל.longitude: ב-JSON הוא נקרא lng. תיקון ה-CodingKeys פתר את זה. בדיקת JSON אמיתי מול המודל חשפה את הטעות.הטקסט המלא של הדקות הראשונות בהרצאה «דוגמאות לעבודה עם JSON - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום וברוכים הבאים אנחנו רוצים להמשיך בדוגמאות ופתרון של מקרים בעבודה עם ג'ייסון בפרוטוקול קודאבל אז בואו ניכנס רגע לגוגל ונמצא את הג'ייסון של גוגל פלייסס איך שהוא נראה וננסה להתמודד איתו בסוויפט אז אנחנו כותבים בגוגל גוגל פלייסס API וכאן אנחנו ניכנס ל-overview
ותחת פלייס סרצ' אנחנו נסתכל על איזושהי דוגמה של ג'ייסון שהם נותנים וננסה לפענח אותה אז אנחנו נרד פה למטה ונראה איך נראה התוצאה של העבודה עם ה-API הזה.
והנה יש לנו פה רספונסס, כאן יש רספונס יותר פשוט ומתחת יש איזשהו רספונס ככה יותר מעניין. אז בואו נעתיק את ה-JSON הזה, בסדר?
זה ה-JSON שאנחנו רוצים להעתיק. כרגע אנחנו עדיין עובדים עם קבצים מקומיים, אז בואו נקפוץ ל-Finder ופשוט נשמור את הדבר הזה כקובץ מקומי קודם כל.
אז ב-Finder יש לי פה את הקובץ הזה מוק דאטה JSON מהשיעור הקודם, יכול בעצם להעתיק אותו או פשוט לעבוד עליו בוא נלחץ פה נערוך אותו נעשה command a נמחק הכל ונדביק את הג'ייסון שזה עתה קיבלנו ואני אשמור את זה טוב דרך אגב המוק דאטה שיש בפרויקט הקודם עדיין נשמר בפרויקט הקודם זה פשוט תקיע דאונלודס ועשינו קופי לפרויקט טוב עכשיו בוא
נפתח את אקסקוד ונייצר לנו פרויקט חדש אז create new xcode project ובואו נקרא לזה json demo places אנחנו מתרגלים עדיין עבודה עם json אז בואו נעשה next ואנחנו מייצרים את זה בתיקייה הרגילה שלנו מצוין עכשיו כמו בשיעור הקודם אנחנו רוצים לגרור את הקובץ הזה של המוק דאטה נגיד פה מתחת לview controller ולהעתיק
אותו לפרויקט ולדאוג שהוא יעבור קומפילציה עם הפרויקט וכך הלאה ובואו נפתח פה את xcode במסך שלם ואנחנו רוצים לייצר לעצמנו קובץ חדש קובץ החדש בשביל לעשות סיריאליזציה ודה סיריאליזציה האובייקטים האלה של ה-places אנחנו נקרא לו place אז new swift file בואו נקרא לזה place.swift אנחנו נרצה פה לעבוד עם foundation זה מספיק
טוב אנחנו נרצה structure place שיתאים למה שכתוב פה ב-json בסדר עכשיו אם אתם מסתכלים פה על ה-json אז המידע פה הוא הרבה פעמים בתוך קונטיינרים מיותרים מבחינתנו זאת אומרת יש פה את ה-result בפנים יש geometry בפנים יש location ואז יש את ה-latitude longitude
מבחינתי ב-place יכול להיות ישר ה-latitude longitude באותו אופן יש לנו פה עוד פעם נסטד קונטיינר של ה-Opening Hours ובסך הכל אנחנו נרצה תכונה של Open Now True or False.
לגבי פוטוס יש פה מערך של תמונות, של אובייקטים. עכשיו בעוד מתאים לי שיהיה לי אובייקט לפוטו אחד, המערך הזה תמיד מכיל איבר אחד, אז אם אנחנו רואים שבכל הפעמים במערך יש תמונה אחת, אז בואו פשוט נשמור תמונה אחת.
טוב, אז איך אנחנו ממדלים את זה? עושים לזה מודל בעצם בפלייסט נקודה סוויפט. בואו נייצר פה סטראקט קודם כל של פלייס ובסטראקט הזה בואו נבחר את התכונות שאנחנו רוצים אני ארצה שיהיה לי את הלטיטוד ולונגיטוד מיד כתכונה אז let lat מסוג של דאבל ואותו דבר לגבי לונגיטוד למקרה
שאתם לא יודעים אז הלונגיטוד סליחה let longitude למקרה שאתם לא מכירים אז latitude ולונגיטוד זה נקודות ציון אורך רוחב בסדר זה פשוט מספרים כאלה של המיקום עצמו עכשיו מעבר לlatitude longitude בוא ניקח אייקון ID, name וכן הלאה, אז נחזור חזרה ונוסיף לעצמנו את אייקון שיהיה סטרינג, את ה-ID כסטרינג, את
ה-Name של המקום כסטרינג. עכשיו במקום הקונטיינר של open in hours, בואו פשוט נעשה open now והוא יהיה פשוט בוליאנינג.
אנחנו נרצה אובייקט אחד של פוטו ובשביל זה אנחנו נצטרך לייצר סטראקט, אז עוד מעט נעשה את זה, כרגע פשוט נרשום את זה ככה, ותכף נעשה גם סטראק של פוטו כדי שהקומפיילר יהיה מרוצה ועוד מעט נעבוד עליו.
מעבר לפוטו אנחנו נרצה פלייס איי-די שיהיה סטרינג, אנחנו נרצה טייפס שזה יהיה מערך של סטרינגים ואנחנו נרצה ויסיניטי במקום קרוב לאיזה ויסיניטי בהתאם למה שיש ב-API. בוא נסתכל רגע מאיפה באות התכונות של הפלייס איי-די והטייפס וכן הלאה.
Opening Hours, אחר כך יש לנו Place ID, פה יש איזשהו רפרנס שלא לקחתי אותו בחשבון, אפשר כמובן להוסיף אותו אם אתם רוצים. הטייפס זה מערך, ו-Vicinity זה סטרינג.
אז לקחתי את כל התכונות הבסיסיות, אבל בקשר ללטיטוד ולונגיטוד החלטתי לכלות אותם כתכונות פשוטות יותר, במקום לעשות נסטד סטרקצ'רס מיותרים מבחינתנו בפרויקט.
ולגבי הפוטו, בואו נעבוד על הסטרקצ' של הפוטו עכשיו, ונוסיף לו את התכונות של ההייט, וויטף, ואפשר גם לקחת את הפוטו רפרנס, נקרא לו פשוט רף.
אז פוטו, יהיה לנו הייט, רגע, יהיה לנו הייט שזה יהיה מספר שלם, יהיה לנו וויד שזה יהיה מספר שלם, ויהיה לנו את הפוטו רף שהוא יהיה סטרינג.
עכשיו, כדי לממש את הפרוטוקול של קודאבל או דיקודאבל, בואו נגיד שאנחנו רוצים רק דיקודאבל, אנחנו פשוט רוצים להיות מסוגלים לקרוא את הג'ייסון מהם, אז כדי לממש פה את הפרוטוקול, הרף זו מילה ששינינו, נכון?
בג'ייסון היה כתוב פוטו רף, אז בואו נעשה אינאם של קודינג קייס כדי לעמוד על השינוי הזה. האינאם הזה יש לו raw value של string כמו שאתם זוכרים והוא מיומש את הפרוטוקול של קודינג קי.
ובקייסס בואו נגיד שיש לנו את height בלי שינוי יש לנו את width בלי שינוי ויש לנו את הרף שבג'ייסון קוראים לזה photo underscore reference.
לגבי ה-height אנחנו צריכים להיות עקביים אז height זה height ובזה מימשנו בפוטו לפחות את decodable כי זה נורא פשוט. עכשיו במערך ב-json result בעצם יש לנו מערך אז אז בואו נעשה עוד סטראקט של places של ה-result אז places ופה פשוט יהיה לנו מערך של place והם קוראים לזה שם אצלם מבחינת coding keys
אז בואו ניצר אצלנו coding keys שזה enum שיש לו raw value של סטרינג וממש את הפרוטוקול coding key הם קוראים ל-places אצלם result אוקיי אז let places שווה ופה אנחנו נרשום results מאיפה זה בא זה בא מפה נכון כאן יש לי results ואני לא רוצה לקרוא לזה לזלזל צריך לקרוא לזה places בסוויפט אוקיי אז יש לנו את האפשרות עם הקודינג קיז לתקן פה את השמות ועכשיו אנחנו יכולים להגיד
עדיין לא אנחנו נרצה להגיד אבל שplaces הוא דיקודאבל אז בואו נגיד את זה עכשיו למה זה לא יכול להתקיים בגלל שplace עצמו הוא לא דיקודאבל נכון אז בואו נעשה את האימפלמנטציה שלנו של דיקודאבל לפלייס בוא נעשה extension לפלייס שכאן נמצאת כל העבודה כדי לממש יש את הפרוטוקול Decodable ואנחנו רוצים לעשות את הדבר הזה בעצמנו בעצם,
למה? בגלל שהג'ייסון לא דומה בכלל למה שהגדרנו, אנחנו החלטנו לשטח חלק מהדברים באובייקט,