【问题标题】:Checking a type and casting to a concrete type for function signature检查类型并转换为函数签名的具体类型
【发布时间】:2020-02-07 02:40:54
【问题描述】:

我有以下代码,我觉得我可以改进它。具体来说,我想摆脱开关并强制施法。 Polygon 具有以下类型签名:

let polygon: MKShape & MKGeoJSONObject

switch polygon {
case is MKMultiPolygon:
    let multiPoly = polygon as! MKMultiPolygon
    renderer = MKMultiPolygonRenderer(multiPolygon: multiPoly)
case is MKPolygon:
    let polygon = polygon as! MKPolygon
    renderer = MKPolygonRenderer(polygon: polygon)
default:
    fatalError("Should have had a renderer")
}

【问题讨论】:

    标签: ios swift casting


    【解决方案1】:

    您应该保留 switch 方法并使用case let 将您的对象转换为适当的类型:

    switch polygon {
    case let object as MKMultiPolygon:
        renderer = MKMultiPolygonRenderer(multiPolygon: object)
    case let object as MKPolygon:
        renderer = MKPolygonRenderer(polygon: object)
    default:
        fatalError("Should have had a renderer")
    }
    

    【讨论】:

    • 如此明显:) 谢谢
    【解决方案2】:

    如果您真的知道它将是其中一种类型,只需强制转换最后一种。

    renderer =
      (polygon as? MKMultiPolygon).map(MKMultiPolygonRenderer.init)
      ?? MKPolygonRenderer(polygon: polygon as! MKPolygon)
    

    【讨论】:

    • 这很好,但我想避免爆炸。谢谢:)
    • 这没有任何意义。这就是它的用途。
    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多