POI代表以下代码中的兴趣点。
我试图区分对它们有兴趣点的路线。路线可以是东/西路线或北/南路线。
我有一种方法可以确定路线是东/西边界还是北/南边界:
func getRouteDirection() -> DirectionForRoute{...}
根据此方法中确定的方向,该方法构造要返回的DirectionForRoute
对象。该对象具有以下定义:
protocol Couplable{}
struct DirectionForRoute{
var routeDirection: String
var POIs: Couplable
init(routeDirection: String, POIs: Couplable) {
self.routeDirection = routeDirection
self.POIs = POIs
}
}
routeDirection
变量不言自明,它基本上取两个可能值之一"EAST/WEST"
或"NORTH/SOUTH"
。
然而,POIs
变量有点复杂。根据路线的方向,我希望为POIs
变量分配两种可能的结构之一:
struct EastWestBoundPOIs: Couplable {
var eastBoundPOIs: [POI]
var westBoundPOIs: [POI]
init(eastBoundPOIs: [POI], westBoundPOIs: [POI]) {
self.eastBoundPOIs = eastBoundPOIs
self.westBoundPOIs = westBoundPOIs
}
}
struct NorthSouthBoundPOIs: Couplable {
var northBoundPOIs: [POI]
var southBoundPOIs: [POI]
init(northBoundStops: [POI], southBoundStops: [POI]) {
self.northBoundPOIs = northBoundPOIs
self.southBoundPOIs = southBoundPOIs
}
}
当getRouteDirection()
方法返回类型为DirectionForRoute
的值时,我无法访问分配给POIs
变量的最后两个结构的内部变量,因为它的类型为Couplable
}。
我的问题是,我是否正确使用结构来实现我想要做的事情?有更好的方法吗?
P.S。如果可能的话,我想尽量避免施法。
答案 0 :(得分:0)
我不明白你为什么不写一些更简单,更接近我们人类直觉的东西:
enum Direction {
case northSouth
case eastWest
}
enum Side {
case left
case right
}
struct POI {
let side : Side
}
struct Route {
let pois : [POI]
let direction : Direction
}
你现在只需要为“左”和“右”的意思制定一个约定。让我们说它们在方向名称的第一个方向上被认为是。现在,根据路线计算哪些POI位于我们行驶的道路一侧,这是微不足道的。
答案 1 :(得分:0)
这是一个想法。它比你的解决方案简单,但它没有那么好的命名约定。但是,它可能会为您提供一些想法,并允许您重构以满足您的确切需求。
首先,使用String
enum
enum Direction {
case northSouth
case eastWest
}
接下来,您的DirectionForRoute
更有意义地被命名为Route
,它有一个方向和一些兴趣点。
struct Route {
var direction: Direction
var northOrEastPOIs: [POI]
var southOrWestPOIs: [POI]
}