Migracja do GMSPlaceField jako NS_OPTIONS

Począwszy od wersji 4.0.0 pakietu SDK Miejsca 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. Nadal możesz używać GMSPlaceField tak jak do tej pory.

  • Jeśli używasz Swift: implementacja nie zadziała, jeśli używasz składni GMSPlaceField(rawValue:) jako konstruktora, który w starszych wersjach pakietu SDK zwraca opcjonalną wartość GMSPlaceField?. Wersja 4.0.0 i nowsze zwracają wartość GMSPlaceField, która nie jest opcjonalna. Wszelkie operacje wykonywane na opcjonalnych wartościach, takie jak sprawdzanie warunkowe 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. Poniższe przykłady pokazują, jak rozwiązać te problemy, a także jak za pomocą składni tablicy zadeklarować zmienną GMSPlaceField:

Warunkowe rozpakowywanie

W tym przykładzie instrukcja if służy do utworzenia tablicy GMSPlaceField, która wymaga warunkowego rozpakowania. Spowoduje to błąd kompilatora („Inicjator 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, jak tutaj:

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

Wymuszanie rozpakowywania

W poniższym przykładzie użyto instrukcji GMSPlaceField jako nieopcjonalnej instrukcji. Spowoduje to błąd kompilatora („Nie można wymusić rozpakowania wartości typu GMSPlaceField, który nie jest opcjonalny”).

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

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

// 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]