Использование NS_OPTIONS в GMSPlaceField

Начиная с версии 4.0.0 Places SDK для iOS тип GMSPlaceField использует макрос NS_OPTIONS. В версиях 3.x SDK GMSPlaceField обозначается как NS_ENUM и по-прежнему поддерживается.

  • Если вы используете Objective-C, никаких последствий не будет. Вы можете продолжить пользоваться GMSPlaceField.

  • Если вы используете Swift, ваша реализация будет работать неправильно, если вы используете синтаксис GMSPlaceField(rawValue:) в качестве конструктора, который более старые версии SDK возвращали как необязательный GMSPlaceField?. В версии 4.0.0 и более поздних возвращается необязательное значение GMSPlaceField, поэтому любые операции, выполняемые с необязательным значением, например условные проверки или принудительное извлечение, будут завершаться с ошибкой. Кроме того, теперь вы можете использовать синтаксис массива, чтобы объединять GMSPlaceField.

Перенос кода

В Swift не будут работать некоторые синтаксические конструкции для условного или принудительного извлечения. В приведенных ниже примерах показано, как устранить эти проблемы, а также как использовать синтаксис массива для объявления GMSPlaceField.

Условная распаковка

В приведенном ниже примере показано, как использовать if для создания массива GMSPlaceField, для которого требуется условная распаковка. В результате возникнет ошибка компилятора ("Инициализатор для условной привязки должен иметь тип Optional, а не GMSPlaceField").

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

Чтобы устранить проблему, удалите оператор if, как показано ниже:

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

Вы также можете использовать синтаксис массива, как показано ниже:

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

Принудительная распаковка

В приведенном ниже примере оператор GMSPlaceField используется как необязательный тип. Это приведет к ошибке компилятора ("Cannot force unwrap value of non-optional type GMSPlaceField."):

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

Чтобы устранить эту проблему, используйте GMSPlaceField в качестве необязательного типа, как показано ниже.

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

Вы также можете использовать синтаксис массива, как показано ниже:

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