Migracja do GMSPlaceField jako NS_OPTIONS

Począwszy od wersji 4.0.0 pakietu Places SDK na iOS typ GMSPlaceField używa teraz makra NS_OPTIONS. Wersje 3.x pakietu SDK mają GMSPlaceField jako NS_ENUM i nadal są obsługiwane.

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

  • Jeśli używasz Swifta: implementacja się zepsuje, jeśli używasz składni GMSPlaceField(rawValue:) jako konstruktora, który w starszych wersjach pakietu SDK zwraca opcjonalny element GMSPlaceField?. Wersja 4.0.0 i nowsze zwracają nieopcjonalną wartość GMSPlaceField; wszelkie operacje wykonywane na opcjonalnych wartościach, takie jak sprawdzanie warunków czy wymuszanie rozpakowania, nie powiedzie się. Dodatkowo możesz teraz używać składni tablic do łączenia wartości GMSPlaceField

Migracja kodu

Niektóre warunkowe lub wymuszone rozpakowania składni nie będą działać w Swift. Przykłady poniżej pokazują, jak rozwiązać te problemy, a także jak za pomocą składni tablicowej zadeklarować zmienną GMSPlaceField:

Wyodrębnianie warunkowe

Wyrażenie w tym przykładzie pokazuje użycie funkcji if do utworzenia tablicy GMSPlaceField, która wymaga warunkuwnego rozpakowania. Spowoduje to błąd kompilatora („Inicjalizator dla warunkowego wiązania musi mieć typ Optional, a nie 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:

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

Wymuszanie rozpakowywania

W tym przykładzie użyto instrukcji GMSPlaceField jako nieopcjonalnej instrukcji. Spowoduje to błąd kompilatora („Nie można wymusić rozpakowania wartości typu nieopcjonalnego GMSPlaceField”).

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

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

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

Możesz też użyć składni tablicy:

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