Migracja do GMSPlaceField jako NS_OPTIONS

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

  • Jeśli używasz 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 warunków lub wymuszone rozpakowywanie, zakończą się niepowodzeniem. Dodatkowo możesz teraz używać składni tablicy, aby łączyć GMSPlaceFields.

Migracja kodu

Niektóre składnie warunkowego lub wymuszonego wyodrębniania nie będą działać w języku Swift. 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 („Inicjator wiązania warunkowego 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 pokazano tutaj:

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

Wymuszone wyodrębnianie

Instrukcja w przykładzie poniżej pokazuje użycie 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 tutaj:

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