2017-05-08 55 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] 
}