2016-12-24 11 views
2

NOAA天気観測ステーションのリストを返すために、次のクラスがあります。私はそれを使ってXMLを扱う方法を学んでいます。しかし、func returnWxStation() - >(wxObservationStations)でエラーとして "宣言されていない型の使用" wxObservationStations '"が表示されています。私はSWXMLHashを使用してXMLを逆シリアル化していますが、それは私の問題だとは思いません(私はちょうど学んでいるので、そうかもしれません)。Swift 3で宣言されていない型の使用

class WxObservationStations { 

let wxObserStationsURL = URL(string: "http://w1.weather.gov/xml/current_obs/index.xml") 

struct wxStation: XMLIndexerDeserializable { 
    let stationName: String 
    let stationState: String 
    let latitude: Double 
    let longitude: Double 

    static func deserialize(_ node: XMLIndexer) throws -> wxStation { 
     return try wxStation(
      stationName: node["station_name"].value(), 
      stationState: node["state"].value(), 
      latitude: node["latitude"].value(), 
      longitude: node["longitude"].value() 
     ) 
    } 
} 

public var wxObservationStations: [wxStation] = [] 


private func getStationNamesAndLocations(url: URL, completion:@escaping (XMLIndexer) ->()) { 

    Alamofire.request(url).responseJSON { response in 
     //    print(response) // To check XML data in debug window. 
     let wxStationList = SWXMLHash.parse(response.data!) 
     print(wxStationList) 
     completion(wxStationList) 

    } 
} 

//The error is here: 
func returnWxStation() -> (wxObservationStations) { 
    getStationNamesAndLocations(url: wxObserStationsURL!, completion: { serverResponse in 
     do { 
      self.wxObservationStations = try serverResponse["wx_station_index"]["station"].value() 

     } catch { 

     } 
    }) 
     return self.wxObservationStations 
} 
} 

どのような考えですか?変数はクラスで宣言されています。この変数を使用して、要求しているオブジェクトにデータを戻します。前もって感謝します。

答えて

1

wxObservationStationsはタイプではないので、それはあなたがタイプ[wxStation]であるself.wxObservationStationsを、帰国している

func returnWxStation() -> (wxObservationStations) { ... } 

を言っても意味がありません。だから、メソッド宣言がところで

func returnWxStation() -> [wxStation] { ... } 

する必要があり、あなたの人生ははるかに簡単になりますあなたはココアの命名規則に固執する場合、すなわちタイプは大文字で始めるべきです。したがって、wxStationタイプではなく、WxStationをお勧めします。


あなたの次のメソッドは、あなたが望むものを達成することはできないだろう。

func returnWxStation() -> [wxStation] { 
    getStationNamesAndLocations(url: wxObserStationsURL!, completion: { serverResponse in 
     do { 
      self.wxObservationStations = try serverResponse["wx_station_index"]["station"].value() 
     } catch { 

     } 
    }) 

    return self.wxObservationStations 
} 

非同期的に実行し、あなたのself.wxObservationStationsreturnWxStationが実際に返すことに時間が移入されることはありませんgetStationNamesAndLocations方法を。

getStationNamesAndLocationsメソッドの目的はすべて、完了ハンドラを備えた素晴らしい非同期メソッドを提供することです。あなたのコードから完全にreturnWxStationを消耗します。またはのようなものを実行します。

func returnWxStation(completionHandler: ([wxStation]?) -> Void) { 
    getStationNamesAndLocations(url: wxObserStationsURL!) { serverResponse in 
     do { 
      let stations = try serverResponse["wx_station_index"]["station"].value() 
      completionHandler(stations) 
     } catch { 
      completionHandler(nil) 
     } 
    } 
} 

そして、あなたはそうのようにそれを使用したい:

returnWxStation() { stations in 
    guard let stations = stations else { 
     // handle error here 
     return 
    } 

    // use `stations` here 
} 

// but not here 
+0

ありがとう!私は慣習に固執しようとしていますが、私が学んでいるように、私は物事がタイプであるのかオブジェクトであるのかは不明です。コードが動作するかどうかについては、それが理由ではないと思っていましたが、ビルドして実行するようにしていますので、そこから作業することができるので、追加の答えは大きな助けになります。 – Yrb

+0

@Rob、あなたが編集ミスをしたように見えることを除いて、すばらしい答えです。 returnWxStation関数のコードは、 'try serverResponse ...'を返すべきではありません。その行は、その式を補完ハンドラに渡す必要があります。 –

+0

@DuncanC - まあまあです。ありがとう。一定。 – Rob

関連する問題