Проверка типа и приведение к конкретному типу для подписи функции - PullRequest
1 голос
/ 07 февраля 2020

У меня есть следующий код, и я чувствую, что могу его улучшить. Конкретно я бы хотел избавиться от переключателя и принудительного литья. Полигон имеет следующую подпись типа:

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")
}

Ответы [ 2 ]

3 голосов
/ 07 февраля 2020

Вы должны придерживаться подхода переключения и использовать 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")
}
1 голос
/ 07 февраля 2020

Если вы действительно знаете, что это будет один из этих типов, просто примените силу последним.

renderer =
  (polygon as? MKMultiPolygon).map(MKMultiPolygonRenderer.init)
  ?? MKPolygonRenderer(polygon: polygon as! MKPolygon)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...