PracticU

סריאליזציה של אובייקט ב-Xcode-Swift

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode › סריאליזציה של אובייקט ב-Xcode-Swift
מילון מושגים:
Xcode - סביבת הפיתוח של אפל לכתיבת אפליקציות ל-iOS ול-macOS.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.
ירושה - מנגנון בתכנות מונחה עצמים שבו מחלקה יורשת תכונות ופעולות ממחלקת אב, ויכולה להרחיב אותן.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
View - רכיב שאחראי על הצגת המידע למשתמש (התצוגה) בדפוס MVC. גם טבלה וירטואלית מבוססת שאילתה במסד נתונים.
קונטרולר - רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).

סריאליזציה של אובייקט ב-Xcode-Swift
כדי לשמור ב-User Defaults אובייקט משלנו, צריך להפוך אותו לנתונים בינאריים (סריאליזציה) ובחזרה (דה-סריאליזציה). ב-Swift עושים זאת בעזרת הפרוטוקול NSCoding, והשיעור מראה את כל הדרך על מחלקה בשם Contact.
השלבים העיקריים
1. המחלקה: פרויקט חדש בשם NSCoding Demo ומחלקה Contact עם firstName, lastName ובנאי. זו חייבת להיות מחלקה ולא struct, כי struct לא יכול לציית ל-NSCoding.
2. מימוש הפרוטוקול: מוסיפים את שתי הפעולות הנדרשות. encode(with:) שומר כל שדה עם key. init?(coder:) מחזיר את השדות באמצעות decode.
3. ירושה מ-NSObject: המחלקה חייבת לרשת מ-NSObject בשביל עבודה עם NSKeyedArchiver.
4. שיפור הקוד: במקום מחרוזות קבועות בקוד מגדירים enum בשם Keys עם raw value מסוג String ושימוש ב-rawValue. במקום force cast משתמשים ב-guard let ומחזירים nil אם ההמרה נכשלת.
5. סריאליזציה: יוצרים אובייקט Contact, ועם NSKeyedArchiver.archivedData מקבלים Data. הפעולה זורקת שגיאה, ובדמו משתמשים ב-force try כדי לקצר, והפרמטר requiringSecureCoding הוא false.
6. שמירה וטעינה: את ה-Data שומרים ב-UserDefaults.standard תחת key, וטוענים עם data(forKey:).
7. דה-סריאליזציה: NSKeyedUnarchiver מחזיר את ה-Data לאובייקט Contact, עם cast לטיפוס.
8. הדפסה: ההדפסה הראשונה מציגה רק שם מחלקה וכתובת בזיכרון. כיוון ש-NSObject כבר מממש את CustomStringConvertible, לא ניתן לממש אותו שוב (Redundant Conformance), ולכן דורסים את description.
שימו לב
- NSCoding מצריך הרבה קוד, ויש דרכים אחרות שילמדו בהמשך המודול.
- השיטה בכל זאת בשימוש: ל-View Controller יש init(coder:), וכל האובייקטים של אפל כוללים אותו.
- יש גם פרוטוקול דומה בשם NSSecureCoding, שלא נכנסו אליו.
אחרי השיעור אפשר לשמור אובייקט מותאם ב-User Defaults ולקרוא אותו בחזרה. השיעור הבא עוסק במסך הגדרות לאפליקציה.
השיעור הבא בקורס: מסך הגדרות לאפליקציה ב-Xcode-Swift

פרקי ההרצאה: סריאליזציה של אובייקט ב-Xcode-Swift

  1. 00:00

    מה זה סריאליזציה ודה-סריאליזציה

  2. 00:51

    פרויקט חדש ומחלקת Contact

  3. 02:22

    מימוש הפרוטוקול NSCoding

  4. 03:45

    פענוח הנתונים עם decode

  5. 05:07

    קבועים למפתחות בעזרת enum

  6. 07:10

    החלפת force casting ב-guard

  7. 08:27

    למה נדרש class שיורש מ-NSObject

  8. 09:19

    initWithCoder במחלקות של Apple

תמלול ההרצאה: סריאליזציה של אובייקט ב-Xcode-Swift

הטקסט המלא של הדקות הראשונות בהרצאה «סריאליזציה של אובייקט ב-Xcode-Swift» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום וברוכים הבאים בשיעור הקודם התחלנו ללמוד על user defaults ולמדנו איך לשמור מידע בסיסי כולל גם תמונות ודאטה כלומר שמרנו מחוזות או מספרים וגם ראינו שאפשר לשמור דאטה בינארית היום אנחנו רוצים לקחת את הuser defaults צעד אחד קדימה ולדעת איך גם לשמור אובייקטים

  2. 00:21

    שאנחנו יצרנו לתהליך הזה של הפיכת אובייקטים לדאטה בעצם קוראים סריאליזציה של אובייקטים אנחנו נרצה ללמוד לעשות את זה היום והתהליך ההפוך של לקחת דאטה ולהפוך אותו לאובייקטים בחזרה נקרא דה סריאליזציה ואת כל הדברים האלה אנחנו עושים בעזרת פרוטוקול בעצם שנקרא NS Coding אז אנחנו נראה

  3. 00:39

    בדיוק מה צריך לעשות כדי לעמוד בפרוטוקול הזה וככה נוכל לשמור אובייקטים שלנו בשיעור הבא אנחנו נמשיך עם יוזר דיפולטס ונלמד גם איך לעשות מסך הגדרות לאפליקציה אז היום אמרנו סריאליזציה ודה סריאליזציה של אובייקטים בעזרת NS Coding בואו נקפץ רגע ל-Xcode ונעשה לנו פרויקט חדש אז Create a New Project אנחנו רוצים Single View Application בואו נקרא לפרויקט שלנו NS Coding Demo

  4. 01:10

    ואנחנו נעשה Next על כל השאר יפה אז פרויקט חדש לגמרי בואו נסתכל רגע מה אנחנו רוצים לעשות כאן הסריאליזציה ודה סריאליזציה של אובייקטים אנחנו קודם כל צריכים אובייקט אז בואו נייצר לעצמנו קלאס New File אנחנו נייצר Swift File ובואו נקרא לקלאס הזה נניח Contact אז הקלאס של Contact בואו נייצר קלאס קונטקט ואנחנו נרצה

  5. 01:46

    שיהיה לנו variable ל-first name ול-last name וכמובן שברגע שזה קלאס אז אנחנו חייבים גם לייצר בנאי מתאים אז init with first name שהוא סטרינג ו-last name שהוא גם כן סטרינג ובבנאי אנחנו חייבים לשמור את הערכים של התכונות אחרת הם יונילו וזה אסור לנו אז כן יש פה הרבה עבודה בלעשות את זה קלאס נכון היינו מעדיפים לעשות את זה סטראקט אם הייתי עושה סטראקט אז לא הייתי חייב לייצר את הבנאי וזה

  6. 02:24

    היה מתנהג בדרך כלל אותו דבר אז למה אנחנו טורחים פה לעשות את זה קלאס הסיבה היא שאנחנו רוצים לשמור את הדבר הזה ב-user defaults וה-user defaults מצריך אותנו לממש פרוטוקול שנקרא NS-Coding אז בואו נסתכל רגע על הפרוטוקול הזה NS-Coding פרוטוקול שעוזר לנו לקחת אובייקט ולעשות לו encoding או decoding כלומר להפוך אותו לדאטה

  7. 02:48

    וחזרה מדאטה לאובייקט בחזרה אז בשביל לממש את הפרוטוקול צריך להוסיף את המתודות הנדרשות לסריאליזציה ודה סריאליזציה לחצתי פה על הציור שהופיע ואנחנו לוחצים על fix והוא מוסיף לי בעצם סטאבים, מתודות רקוד שאנחנו צריכים לממש כדי לעבוד עם הפרוטוקול.

  8. 03:08

    המתודה הראשונה שאנחנו רואים זה encode with Coder. אז ב-Encode with Coder אנחנו לוקחים את האובייקט שקיבלנו, ה-Coder הזה, ואנחנו בעצם עושים את אותה סריאליזציה, ואנחנו אומרים Coder.Encode ואנחנו נותנים לו את ה-First Name שלנו ואנחנו גם נותנים לו Key איך לשמור אותו, זאת אומרת תחת איזה

  9. 03:18

    שם כמו Identifier אז בוא נקרא לזה נניח First Name, אוקיי? ובאותו אופן אנחנו גם נרצה לשמור את ה-Last Name של האובייקט, last name for key last name אז פה בעצם אנחנו לוקחים את ה-first name וה-last name ויש לנו מתודה שעוזרת לנו לשמור אותם או להפוך אותם לדאטה בסדר להפוך אותם למידע בינארי עכשיו

  10. 03:54

    בחזור זאת אומרת זה בעצם עוזר לנו לעשות את הסריאליזציה בחזור יש לנו דה סריאליזציה ואנחנו משתמשים עוד פעם בקודר הפעם בשביל לעשות decode אוקיי אז self.firstname שווה לקודר.decode עכשיו בגלל ששמרנו פה סטרינגים אז זה יוצא Decode Object אנחנו נשתמש פה ב-4K כמו שהכנסנו אותו ככה אנחנו מוצאים First Name. עכשיו בגלל שזו מתודה שמחזירה

  11. 04:24

    עוד בייקט אנחנו יודעים שזה סטרינג אנחנו רוצים לעשות לזה קאסטינג נניח לסטרינג. אני כרגע אעשה פה Force Casting ועוד מעט נשפר קצת את הגרסה שלנו ואנחנו רוצים לראות את ה-Basics קודם.

  12. 04:36

    אז אני עושה את השורה הזאת עוד פעם ואני עושה בדיוק את אותו דבר עבור הלאסטניים וזה הבסיס בעצם יש לי קלאס רגיל אבל הוספנו פה את שתי המתודות בשביל לשמירה לדאטה וחזרה מדאטה לאובייקט.

  13. 04:51

    עכשיו בואו נוריד את המתודות האלה למטה לפחות מתחת למשתנים נעשה פה קצת סדר בקלאס אז אני אגדיר את המשתנים למעלה כמו שאנחנו אוהבים ואת הבנאי השני שאוסיף עבורי אני אוסיף אותו פה למטה ונסדר טיפה את הכל יפה אז זה הקלאס שלי עכשיו מבחינת צורת

  14. 05:11

    הכתיבה אני לא הכי מרוצה זה לא צורת כתיבה הכי יפה בעולם יש לנו פה force casting לסטרינג מצד אחד וגם אנחנו משתמשים במחרוזות פה בשביל הפרסטניים והלאסטניים וגם פה באותן מחרוזות וזה לא נחשב לבסט פרקטיס בייסט פרקטיס יהיה קודם כל לא לעשות פורס קאסטינג אלא פשוט לבדוק האם הקאסטינג מצליח ודבר שני

  15. 05:35

    בייסט פרקטיס יהיה לשמור את המחוזות האלה בתוך קונסטנטים איכשהו כדי שפשוט נשתמש בהם אז בואו נסדר את הקלאס הזה ככה ברמה קצת יותר גבוהה מה שנקרא אנחנו נגדיר לעצמנו איזשהו אינאם נחמד שיעזור לנו עם הכיס עם השמות של אלה אז בואו נעשה אינאם נעשה אותו נניח פה למטה באזור הזה נקרא לו כיס והטיפוס של האינם יהיה סטרינגים

  16. 06:05

    כאילו רואו וליו של האינם יהיה סטרינג ואנחנו פשוט נגדיר את הקייסים שלנו אז first name וניתן לו ערך של זה ויהיה לנו עוד קייס של last name וניתן לו את הערך של ה last name מה שזה עוזר לי זה פשוט להגדיר קבועים עבור הסטרינגים שהשתמשתי בהם כדי שהם יהיו מוגדרים במקום אחד ואני אשתמש בהם כל הזמן עכשיו איך אנחנו משתמשים באינם במקום להשתמש בסטרינגים

  17. 06:35

    פה אז פשוט אנחנו נרצה להגיד כיס נקודה first name נקודה row value אני יודע שזה קצת מאריך אבל זאת הדרך היותר מקצועית לעשות את זה ואני חייב להראות לכם אותה גם כן. אז כאן אני פשוט משתמש בסטרינגים אבל סטרינגים שהוגדרו כקבועים מראש ואנחנו נשתמש בזה בדיוק אותו דבר גם פה למטה

  18. 06:39

    בסדר אנחנו לא רוצים לרשום hardcoded strings בתוך הקוד שלנו אנחנו מעדיפים לרכז את הסטרינגים במקום אחד כקבועים למשל בinum למטה ולהשתמש בהם כל הזמן אז זה דבר אחד שרציתי להוסיף פה כדי להפוך את הקוד שלנו קצת יותר מקצועי עכשיו דבר שני יש לנו פה בחלק הזה force casting אנחנו מכריחים אותו להיות סטרינג ואם זה לא סטרינג תכריז לי את

  19. 07:18

    התוכנית ואנחנו לא אוהבים את הדבר הזה כל כך אז בואו נתקן את זה כאן אנחנו נרצה לכתוב שורה של בודקת אם זה לא ניל ואם כן אז אנחנו רוצים להחזיר ניל והאינית הזה בעצם לא יחזיר כלום אנחנו רואים שזה אינית סימן שאלה זאת אומרת שמותר לנו להחזיר ניל ואז לא לעשות force casting אז בואו נעשה גארד לט פרסט ניים שווה לדבר הזה אחרת רגע

  20. 07:47

    אבל לא נעשה פורס קאסט כי בשביל זה מנענו פה את כל העניין אחרת נחזיר ניל אוקיי ונעתיק את אותו דבר לגבי הלאסט ניים אז אני אעשה קופי פייסט ופה אני אכתוב בדיוק את אותו דבר אבל עם לאסט ניים גם ופה אנחנו נלך על הלאסט ניים רוצים לוודא שאכן קיבלנו סטרינגים אחרת אנחנו מחזירים ניל

  21. 08:11

    ואם הכל עובד אז בואו נשמור את הפרסט ניים פה ופה נשמור את הלאסטניים, יפה, אז עכשיו הקלאסט שלנו נראה הרבה יותר מוצלח, לא עשינו את העניין הזה עם הקאסטינג בכוח מה שנקרא, אלא בדקנו שהקאסטינג מצליח, ואם לא אז אנחנו מחזירים פה ניל, ודבר שני, השתמשנו בקודינג קיס.

  22. 08:33

    דבר אחרון, אנחנו לא יכולים שהדבר הזה יהיה סטראקט, ויותר מזה, בוא נבדוק שאי אפשר שהדבר הזה יהיה סטראקט, אתה פשוט תרשום פה סטראקט, אתם תוכלו לראות שאי אפשר לממש אינס קודינג בסטראקטים.

  23. 08:45

    אתם רואים? Non-class cannot conform to this protocol. דבר שני, יש לנו אפילו עוד מגבלה אחת, שזה לא צריך להיות סתם קלאס, זה צריך להיות NS Object.

  24. 08:55

    וה-NS Object זה רק בשביל לעבוד אחר כך עם ה-NsKid ארכייבר, אחרת הוא פשוט לא יעבוד לי. אז כן, כל הסיפור הזה אנחנו צריכים בשביל לשמור את האובייקטים שלנו.

  25. 09:04

    עכשיו, אתם יכולים לשאול את עצמכם, וואו, כל כך הרבה טרחה בשביל לעשות סריאלזציה ודה סריאלזציה של אובייקטים, בטח יש דרכים אחרות.

  26. 09:13

    אז א', יש דרכים אחרות ואנחנו נלמד אותן בדיוק בהמשך של המודול הזה. דבר שני, השיטה הזאת נמצאת בשימוש. נגיד אם אתם מסתכלים פה על הקלאס של ViewController, אז תסתכלו איזה איניט מעניין יש לו, InitWithCoder,

  27. 09:27

    אוקיי? זאת אומרת שכל האובייקטים של אפל בעצם יש להם את הדבר הזה של InitWithCoder ו- FromCoder, ולכן רצינו פשוט לדעת שזה קיים וללמוד על זה כדי שאם תיתקלו בזה אי פעם תדעו מאיפה זה מגיע.

לקורס המלא: קורס פיתוח אפליקציות לאייפון

ההרצאה הקודמת: עבודה עם קבצים ב-Xcode - חלק 2

ההרצאה הבאה: מסך הגדרות לאפליקציה ב-Xcode-Swift

הרצאות קשורות מקורסים אחרים

  • אובייקט Screen
  • אובייקט Canvas באנדרואיד
  • שפת JavaScript - אובייקט
  • החזרת אובייקט ב-JSON

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון