Mapbox v10 iOS SDK 的条件颜色表达式

Conditional color expression for Mapbox v10 iOS SDK

随着 Mapbox v10 SDK 进入发布候选阶段,我已经开始更新现有的 iOS 应用程序,该应用程序是基于先前版本的 Mapbox iOS SDK (v6.3) 构建的.该应用程序在地图上显示圆形标记以表示某些 GeoJSON 特征的位置。示例功能如下所示:

{
  "properties" : {
    "type" : "TRUCK",
    "needsHelp" : false,
  },
  "id" : 12345,
  "type" : "Feature",
  "geometry" : {
    "type" : "Point",
    "coordinates" : [
      -122.28992161530911,
      47.46347019873241
    ]
  }
}

我正在使用此 CircleLayer 的运行时样式,并且此层的 .circleColor 属性 被设置为一个表达式,其工作方式如下:

if (feature.properties.needsHelp == true) {
   // the circle color should be red
} else {
   // the circle color is determined by the value of the features "type" property
}

在之前版本的Mapbox iOS SDK中,表达式是使用NSExpression实现的,当然,我使用了三元运算符和MGL_Match运算符的组合来实现实现这种行为。使用新的 v10 iOS SDK,表达式现在有了自己的 DSL,我知道您也可以使用原始 JSON 内联定义它们,以便与 Mapbox GL JS 更加一致。不幸的是,我发现自己正在努力寻找使用新 SDK 实现此表达式逻辑的正确方法。

目前,我的表达式定义如下:

let colorExpression = Exp(.match) {
    Exp(.get) { "type" }
    "TRUCK"
    UIColor.systemBlue
    "SHIP"
    UIColor.systemOrange
    "AIRCRAFT"
    UIColor.systemGreen
    UIColor.systemGray // default color if some other "type" value
}

circleLayer.circleColor = .expression(colorExpression)

这提供了上面描述的“else”逻辑,但我仍然缺少“if”逻辑来首先检查“.needsHelp”功能属性以查看它是否为真,然后return UIColor.red.

我一直在查看 Mapbox Style Specification 文档,它看起来像'case' operator could be used to provide if/else functionality. One of the Mapbox v10 SDK examples here 展示了如何在表达式中使用 .switchCase 运算符,但我并不完全清楚我在上面定义的“其他”逻辑将适合 .switchCase 运算符的示例用法。任何人都可以对此提供一些见解吗?非常感谢。

经过反复试验,我想我找到了解决问题的方法。可能有其他(更好的?)方法来实现相同的逻辑,但下面的表达式似乎对我来说工作正常:

let colorExpression = Exp(.switchCase) {
    Exp(.eq) {
        Exp(.get) { "needsHelp" }
        true
    }
    UIColor.systemRed
    Exp(.match) {
        Exp(.get) { "type" }
        "TRUCK"
        UIColor.systemBlue
        "SHIP"
        UIColor.systemOrange
        "AIRCRAFT"
        UIColor.systemGreen
        UIColor.systemGray
    }
}