从 Places SDK for iOS 的 4.0.0 版开始,GMSPlaceField 类型现在使用 NS_OPTIONS 宏。SDK 的 3.x 版将 GMSPlaceField 作为 NS_ENUM,并且仍受支持。
如果您使用的是 Objective-C: 没有影响。您可以继续像以前一样使用
GMSPlaceField。如果您使用的是 Swift: 如果您使用
GMSPlaceField(rawValue:)语法作为构造函数,则实现将会中断,因为旧版 SDK 会将该语法作为可选的GMSPlaceField?返回。4.0.0 及更高版本会返回非可选的GMSPlaceField值;对可选值执行的任何操作(例如条件检查或强制解包)都会失败。此外,您现在可以使用数组语法来组合GMSPlaceField。
迁移代码
某些条件解包或强制解包语法在 Swift 中会中断。
以下示例展示了如何修复这些问题,还演示了如何使用数组语法来声明 GMSPlaceField:
条件解包
以下示例中的语句展示了如何使用 if 创建需要条件解包的 GMSPlaceField 数组。这会导致编译器错误(“Initializer for conditional binding must have Optional type, not 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]