Migrar a GMSPlaceField como NS_OPTIONS

A partir de la versión 4.0.0 del SDK de Places para iOS, el tipo GMSPlaceField ahora usa la macro NS_OPTIONS. Las versiones 3.x del SDK tienen GMSPlaceField como NS_ENUM y aún son compatibles.

  • Si usas Objective-C: No hay consecuencias. Puedes seguir usando GMSPlaceField como antes.

  • Si usas Swift: Tu implementación fallará si usas la sintaxis GMSPlaceField(rawValue:) como constructor, que las versiones anteriores del SDK devolvieron como un GMSPlaceField? opcional. La versión 4.0.0 y versiones posteriores muestran un valor GMSPlaceField no opcional. Fallarán todas las operaciones que se realicen en el valor opcional, como las verificaciones condicionales o el desenmarañamiento forzado. Además, ahora puedes usar la sintaxis de array para combinar GMSPlaceField

Cómo migrar tu código

Ciertos sintaxis de anulación condicional o anulación forzada fallarán en Swift. En los siguientes ejemplos, se muestra cómo corregir estos problemas y también se usa la sintaxis de array para declarar GMSPlaceField:

Desenlace condicional

En la sentencia del siguiente ejemplo, se muestra el uso de if para crear un array GMSPlaceField que requiere el desanidamiento condicional. Esto generará un error de compilación ("El inicializador para la vinculación condicional debe tener el tipo Opcional, no GMSPlaceField").

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

Para solucionar este problema, quita la sentencia if, como se muestra a continuación:

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

También puedes usar la sintaxis de array, como se muestra aquí:

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

Separación forzada

En la sentencia del siguiente ejemplo, se muestra el uso de GMSPlaceField como un tipo no opcional. Esto generará un error de compilación ("No se puede forzar el valor de desempaquetado del tipo no opcional GMSPlaceField"):

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

Para solucionar este problema, usa GMSPlaceField como un tipo opcional, como se muestra aquí:

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

También puedes usar la sintaxis de array, como se muestra aquí:

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