
Contact עם firstName, lastName ובנאי. זו חייבת להיות מחלקה ולא struct, כי struct לא יכול לציית ל-NSCoding.encode(with:) שומר כל שדה עם key. init?(coder:) מחזיר את השדות באמצעות decode.Keys עם raw value מסוג String ושימוש ב-rawValue. במקום force cast משתמשים ב-guard let ומחזירים nil אם ההמרה נכשלת.NSKeyedArchiver.archivedData מקבלים Data. הפעולה זורקת שגיאה, ובדמו משתמשים ב-force try כדי לקצר, והפרמטר requiringSecureCoding הוא false.UserDefaults.standard תחת key, וטוענים עם data(forKey:).NSKeyedUnarchiver מחזיר את ה-Data לאובייקט Contact, עם cast לטיפוס.CustomStringConvertible, לא ניתן לממש אותו שוב (Redundant Conformance), ולכן דורסים את description.init(coder:), וכל האובייקטים של אפל כוללים אותו.הטקסט המלא של הדקות הראשונות בהרצאה «סריאליזציה של אובייקט ב-Xcode-Swift» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום וברוכים הבאים בשיעור הקודם התחלנו ללמוד על user defaults ולמדנו איך לשמור מידע בסיסי כולל גם תמונות ודאטה כלומר שמרנו מחוזות או מספרים וגם ראינו שאפשר לשמור דאטה בינארית היום אנחנו רוצים לקחת את הuser defaults צעד אחד קדימה ולדעת איך גם לשמור אובייקטים
שאנחנו יצרנו לתהליך הזה של הפיכת אובייקטים לדאטה בעצם קוראים סריאליזציה של אובייקטים אנחנו נרצה ללמוד לעשות את זה היום והתהליך ההפוך של לקחת דאטה ולהפוך אותו לאובייקטים בחזרה נקרא דה סריאליזציה ואת כל הדברים האלה אנחנו עושים בעזרת פרוטוקול בעצם שנקרא NS Coding אז אנחנו נראה
בדיוק מה צריך לעשות כדי לעמוד בפרוטוקול הזה וככה נוכל לשמור אובייקטים שלנו בשיעור הבא אנחנו נמשיך עם יוזר דיפולטס ונלמד גם איך לעשות מסך הגדרות לאפליקציה אז היום אמרנו סריאליזציה ודה סריאליזציה של אובייקטים בעזרת NS Coding בואו נקפץ רגע ל-Xcode ונעשה לנו פרויקט חדש אז Create a New Project אנחנו רוצים Single View Application בואו נקרא לפרויקט שלנו NS Coding Demo
ואנחנו נעשה Next על כל השאר יפה אז פרויקט חדש לגמרי בואו נסתכל רגע מה אנחנו רוצים לעשות כאן הסריאליזציה ודה סריאליזציה של אובייקטים אנחנו קודם כל צריכים אובייקט אז בואו נייצר לעצמנו קלאס New File אנחנו נייצר Swift File ובואו נקרא לקלאס הזה נניח Contact אז הקלאס של Contact בואו נייצר קלאס קונטקט ואנחנו נרצה
שיהיה לנו variable ל-first name ול-last name וכמובן שברגע שזה קלאס אז אנחנו חייבים גם לייצר בנאי מתאים אז init with first name שהוא סטרינג ו-last name שהוא גם כן סטרינג ובבנאי אנחנו חייבים לשמור את הערכים של התכונות אחרת הם יונילו וזה אסור לנו אז כן יש פה הרבה עבודה בלעשות את זה קלאס נכון היינו מעדיפים לעשות את זה סטראקט אם הייתי עושה סטראקט אז לא הייתי חייב לייצר את הבנאי וזה
היה מתנהג בדרך כלל אותו דבר אז למה אנחנו טורחים פה לעשות את זה קלאס הסיבה היא שאנחנו רוצים לשמור את הדבר הזה ב-user defaults וה-user defaults מצריך אותנו לממש פרוטוקול שנקרא NS-Coding אז בואו נסתכל רגע על הפרוטוקול הזה NS-Coding פרוטוקול שעוזר לנו לקחת אובייקט ולעשות לו encoding או decoding כלומר להפוך אותו לדאטה
וחזרה מדאטה לאובייקט בחזרה אז בשביל לממש את הפרוטוקול צריך להוסיף את המתודות הנדרשות לסריאליזציה ודה סריאליזציה לחצתי פה על הציור שהופיע ואנחנו לוחצים על fix והוא מוסיף לי בעצם סטאבים, מתודות רקוד שאנחנו צריכים לממש כדי לעבוד עם הפרוטוקול.
המתודה הראשונה שאנחנו רואים זה encode with Coder. אז ב-Encode with Coder אנחנו לוקחים את האובייקט שקיבלנו, ה-Coder הזה, ואנחנו בעצם עושים את אותה סריאליזציה, ואנחנו אומרים Coder.Encode ואנחנו נותנים לו את ה-First Name שלנו ואנחנו גם נותנים לו Key איך לשמור אותו, זאת אומרת תחת איזה
שם כמו Identifier אז בוא נקרא לזה נניח First Name, אוקיי? ובאותו אופן אנחנו גם נרצה לשמור את ה-Last Name של האובייקט, last name for key last name אז פה בעצם אנחנו לוקחים את ה-first name וה-last name ויש לנו מתודה שעוזרת לנו לשמור אותם או להפוך אותם לדאטה בסדר להפוך אותם למידע בינארי עכשיו
בחזור זאת אומרת זה בעצם עוזר לנו לעשות את הסריאליזציה בחזור יש לנו דה סריאליזציה ואנחנו משתמשים עוד פעם בקודר הפעם בשביל לעשות decode אוקיי אז self.firstname שווה לקודר.decode עכשיו בגלל ששמרנו פה סטרינגים אז זה יוצא Decode Object אנחנו נשתמש פה ב-4K כמו שהכנסנו אותו ככה אנחנו מוצאים First Name. עכשיו בגלל שזו מתודה שמחזירה
עוד בייקט אנחנו יודעים שזה סטרינג אנחנו רוצים לעשות לזה קאסטינג נניח לסטרינג. אני כרגע אעשה פה Force Casting ועוד מעט נשפר קצת את הגרסה שלנו ואנחנו רוצים לראות את ה-Basics קודם.
אז אני עושה את השורה הזאת עוד פעם ואני עושה בדיוק את אותו דבר עבור הלאסטניים וזה הבסיס בעצם יש לי קלאס רגיל אבל הוספנו פה את שתי המתודות בשביל לשמירה לדאטה וחזרה מדאטה לאובייקט.
עכשיו בואו נוריד את המתודות האלה למטה לפחות מתחת למשתנים נעשה פה קצת סדר בקלאס אז אני אגדיר את המשתנים למעלה כמו שאנחנו אוהבים ואת הבנאי השני שאוסיף עבורי אני אוסיף אותו פה למטה ונסדר טיפה את הכל יפה אז זה הקלאס שלי עכשיו מבחינת צורת
הכתיבה אני לא הכי מרוצה זה לא צורת כתיבה הכי יפה בעולם יש לנו פה force casting לסטרינג מצד אחד וגם אנחנו משתמשים במחרוזות פה בשביל הפרסטניים והלאסטניים וגם פה באותן מחרוזות וזה לא נחשב לבסט פרקטיס בייסט פרקטיס יהיה קודם כל לא לעשות פורס קאסטינג אלא פשוט לבדוק האם הקאסטינג מצליח ודבר שני
בייסט פרקטיס יהיה לשמור את המחוזות האלה בתוך קונסטנטים איכשהו כדי שפשוט נשתמש בהם אז בואו נסדר את הקלאס הזה ככה ברמה קצת יותר גבוהה מה שנקרא אנחנו נגדיר לעצמנו איזשהו אינאם נחמד שיעזור לנו עם הכיס עם השמות של אלה אז בואו נעשה אינאם נעשה אותו נניח פה למטה באזור הזה נקרא לו כיס והטיפוס של האינם יהיה סטרינגים
כאילו רואו וליו של האינם יהיה סטרינג ואנחנו פשוט נגדיר את הקייסים שלנו אז first name וניתן לו ערך של זה ויהיה לנו עוד קייס של last name וניתן לו את הערך של ה last name מה שזה עוזר לי זה פשוט להגדיר קבועים עבור הסטרינגים שהשתמשתי בהם כדי שהם יהיו מוגדרים במקום אחד ואני אשתמש בהם כל הזמן עכשיו איך אנחנו משתמשים באינם במקום להשתמש בסטרינגים
פה אז פשוט אנחנו נרצה להגיד כיס נקודה first name נקודה row value אני יודע שזה קצת מאריך אבל זאת הדרך היותר מקצועית לעשות את זה ואני חייב להראות לכם אותה גם כן. אז כאן אני פשוט משתמש בסטרינגים אבל סטרינגים שהוגדרו כקבועים מראש ואנחנו נשתמש בזה בדיוק אותו דבר גם פה למטה
בסדר אנחנו לא רוצים לרשום hardcoded strings בתוך הקוד שלנו אנחנו מעדיפים לרכז את הסטרינגים במקום אחד כקבועים למשל בinum למטה ולהשתמש בהם כל הזמן אז זה דבר אחד שרציתי להוסיף פה כדי להפוך את הקוד שלנו קצת יותר מקצועי עכשיו דבר שני יש לנו פה בחלק הזה force casting אנחנו מכריחים אותו להיות סטרינג ואם זה לא סטרינג תכריז לי את
התוכנית ואנחנו לא אוהבים את הדבר הזה כל כך אז בואו נתקן את זה כאן אנחנו נרצה לכתוב שורה של בודקת אם זה לא ניל ואם כן אז אנחנו רוצים להחזיר ניל והאינית הזה בעצם לא יחזיר כלום אנחנו רואים שזה אינית סימן שאלה זאת אומרת שמותר לנו להחזיר ניל ואז לא לעשות force casting אז בואו נעשה גארד לט פרסט ניים שווה לדבר הזה אחרת רגע
אבל לא נעשה פורס קאסט כי בשביל זה מנענו פה את כל העניין אחרת נחזיר ניל אוקיי ונעתיק את אותו דבר לגבי הלאסט ניים אז אני אעשה קופי פייסט ופה אני אכתוב בדיוק את אותו דבר אבל עם לאסט ניים גם ופה אנחנו נלך על הלאסט ניים רוצים לוודא שאכן קיבלנו סטרינגים אחרת אנחנו מחזירים ניל
ואם הכל עובד אז בואו נשמור את הפרסט ניים פה ופה נשמור את הלאסטניים, יפה, אז עכשיו הקלאסט שלנו נראה הרבה יותר מוצלח, לא עשינו את העניין הזה עם הקאסטינג בכוח מה שנקרא, אלא בדקנו שהקאסטינג מצליח, ואם לא אז אנחנו מחזירים פה ניל, ודבר שני, השתמשנו בקודינג קיס.
דבר אחרון, אנחנו לא יכולים שהדבר הזה יהיה סטראקט, ויותר מזה, בוא נבדוק שאי אפשר שהדבר הזה יהיה סטראקט, אתה פשוט תרשום פה סטראקט, אתם תוכלו לראות שאי אפשר לממש אינס קודינג בסטראקטים.
אתם רואים? Non-class cannot conform to this protocol. דבר שני, יש לנו אפילו עוד מגבלה אחת, שזה לא צריך להיות סתם קלאס, זה צריך להיות NS Object.
וה-NS Object זה רק בשביל לעבוד אחר כך עם ה-NsKid ארכייבר, אחרת הוא פשוט לא יעבוד לי. אז כן, כל הסיפור הזה אנחנו צריכים בשביל לשמור את האובייקטים שלנו.
עכשיו, אתם יכולים לשאול את עצמכם, וואו, כל כך הרבה טרחה בשביל לעשות סריאלזציה ודה סריאלזציה של אובייקטים, בטח יש דרכים אחרות.
אז א', יש דרכים אחרות ואנחנו נלמד אותן בדיוק בהמשך של המודול הזה. דבר שני, השיטה הזאת נמצאת בשימוש. נגיד אם אתם מסתכלים פה על הקלאס של ViewController, אז תסתכלו איזה איניט מעניין יש לו, InitWithCoder,
אוקיי? זאת אומרת שכל האובייקטים של אפל בעצם יש להם את הדבר הזה של InitWithCoder ו- FromCoder, ולכן רצינו פשוט לדעת שזה קיים וללמוד על זה כדי שאם תיתקלו בזה אי פעם תדעו מאיפה זה מגיע.