2017-05-08 56 views
0

POI代表以下代码中的兴趣点。我在Swift中正确使用结构和协议吗?

我想区分具有兴趣点的路线。路线可以是东/西航线或南/北航线。

我有确定的路由是否东/西结合或南/北结合的方法:

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

这真的是你的代码吗? 'self.routeDirection = routeDirection'这一行没有意义,因为没有名为'routeDirection'的传入参数。在我的机器上,这是一个编译错误:“错误:为自己分配一个属性”。 – matt

+0

@matt可能只是一个错字。 'routeDirection'混合的'routeBound'。 – nathan

+0

这是一个错字。我修好了它。@matt –

回答

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 
} 

现在,您只需要补什么“左”和“右”的惯例意思。假设它们按照方向名称的第一个方向计算。现在,根据路线,计算哪些兴趣点在我们正在旅行的道路一侧是微不足道的。

0

这里有一个想法。它比你的解决方案更简单,但它没有很好的命名约定。但是,它可能会给你一些想法,并允许你重构以适应你的确切需求。

首先,代替String代表方向,请使用enum

enum Direction { 
    case northSouth 
    case eastWest 
} 

接下来,你DirectionForRoute会更有意义被命名只是Route,其中有一个方向和兴趣几点。

struct Route { 
    var direction: Direction 
    var northOrEastPOIs: [POI] 
    var southOrWestPOIs: [POI] 
}