Migracja do GMSPlaceField jako NS_OPTIONS

Od wersji 4.0.0 pakietu Places SDK na iOS typ GMSPlaceField korzysta teraz z makra NS_OPTIONS. Wersje pakietu SDK 3.x mają GMSPlaceField jako NS_ENUM i są nadal obsługiwane.

  • Jeśli używasz języka Objective-C: nie ma to żadnych konsekwencji. Możesz nadal korzystać z GMSPlaceField jak dotychczas.

  • Jeśli używasz języka Swift: Twoja implementacja przestanie działać, jeśli używasz składni GMSPlaceField(rawValue:) jako konstruktora, który starsze wersje pakietu SDK zwracały jako opcjonalny typ GMSPlaceField?. Wersja 4.0.0 i nowsze zwracają wartość GMSPlaceField, która nie jest opcjonalna. Wszelkie operacje wykonywane na wartości opcjonalnej, takie jak sprawdzanie warunkowe lub wymuszone rozpakowywanie, zakończą się niepowodzeniem. Dodatkowo możesz teraz używać składni tablicy do łączenia GMSPlaceField.

Migracja kodu

Niektóre składnie warunkowego lub wymuszonego rozpakowywania w Swift będą nieprawidłowe. Poniższe przykłady pokazują, jak rozwiązać te problemy, a także jak używać składni tablicy do deklarowania GMSPlaceField:

Wyodrębnianie warunkowe

Instrukcja w przykładzie poniżej pokazuje, jak za pomocą znaku if utworzyć tablicę GMSPlaceField, która wymaga warunkowego rozpakowania. Spowoduje to błąd kompilatora („Initializer for conditional binding must have Optional type, not GMSPlaceField”).

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

Aby rozwiązać ten problem, usuń instrukcję if, jak pokazano poniżej:

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

Możesz też użyć składni tablicy, jak pokazano tutaj:

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

Wymuszone wyodrębnianie

W instrukcji w przykładzie poniżej pokazano użycie typu GMSPlaceField jako typu nieopcjonalnego. Spowoduje to błąd kompilatora („Cannot force unwrap value of non-optional type GMSPlaceField.”):

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

Aby rozwiązać ten problem, użyj GMSPlaceField jako typu opcjonalnego, jak pokazano poniżej:

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

Możesz też użyć składni tablicy, jak pokazano tutaj:

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