מעבר ל-GMSPlaceField בתור NS_OPTIONS

החל מגרסה 4.0.0 של Places SDK ל-iOS, הסוג GMSPlaceField משתמש עכשיו במאקרו NS_OPTIONS. בגרסאות 3.x של ה-SDK, GMSPlaceField מוגדר כ-NS_ENUM ועדיין יש תמיכה בהן.

  • אם אתם משתמשים ב-Objective-C: אין השפעות. אפשר להמשיך להשתמש ב-GMSPlaceField כרגיל.

  • אם אתם משתמשים ב-Swift: ההטמעה תיכשל אם תשתמשו בתחביר GMSPlaceField(rawValue:) כ-constructor, שהגרסאות הישנות של ה-SDK החזירו כ-GMSPlaceField? אופציונלי. בגרסה 4.0.0 ואילך, הפונקציה מחזירה ערך GMSPlaceField שאינו אופציונלי. כל פעולה שמתבצעת על הערך האופציונלי, כמו בדיקות מותנות או ביטול אריזה בכפייה, תיכשל. בנוסף, עכשיו אפשר להשתמש בתחביר מערך כדי לשלב GMSPlaceFields

העברת הקוד

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

ביטול אריזה מותנה

ההצהרה בדוגמה הבאה מראה שימוש ב-if כדי ליצור מערך GMSPlaceField שדורש ביטול אריזה מותנה. התוצאה תהיה שגיאה במהדר ('ה-initializer לקישור מותנה חייב להיות מסוג Optional, ולא GMSPlaceField').

// Before.
if let field = GMSPlaceField(
    rawValue: GMSPlaceField.name.rawValue | GMSPlaceField.photos.rawValue
) { // Do something }

כדי לפתור את הבעיה, מסירים את ההצהרה if, כפי שמתואר כאן:

// After.
let field =  GMSPlaceField(
    rawValue: GMSPlaceField.name.rawValue | GMSPlaceField.photos.rawValue
)
// Do something

אפשר גם להשתמש בתחביר של מערך, כפי שמוצג כאן:

let field = [GMSPlaceField.name, GMSPlaceField.photos]
// or
let field: GMSPlaceField = [.name, .photos]

אילוץ של ביטול האריזה

בהצהרה שבדוגמאות הבאות מוצג שימוש ב-GMSPlaceField כסוג לא אופציונלי. הפעולה הזו תגרום לשגיאה במהדר ('Cannot force unwrap value of non-optional type GMSPlaceField.‎'):

// Before.
let field = GMSPlaceField(
    rawValue: GMSPlaceField.name.rawValue | GMSPlaceField.photos.rawValue
)!

כדי לפתור את הבעיה, צריך להשתמש ב-GMSPlaceField כסוג אופציונלי, כפי שמוצג כאן:

// After.
let field =  GMSPlaceField(
    rawValue: GMSPlaceField.name.rawValue | GMSPlaceField.photos.rawValue
)

אפשר גם להשתמש בתחביר של מערך, כפי שמוצג כאן:

let field = [GMSPlaceField.name, GMSPlaceField.photos]
// or
let field: GMSPlaceField = [.name, .photos]