我在Swift中正确使用结构和协议吗?

时间:2017-05-08 03:03:34

标签: swift

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。如果可能的话,我想尽量避免施法。

2 个答案:

答案 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]
}