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ą wartość 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 jak dotychczas.

  • Jeśli używasz Swifta: implementacja nie zadziała, 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 tablicy do łączenia 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 warunku odwijania. 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. 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 opcjonalnego typu 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]