2016-12-24 33 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是不是一个类型的,所以它没有任何意义说

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

你返回self.wxObservationStations,这是[wxStation]类型。因此,该方法的声明应该是

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 
} 

getStationNamesAndLocations异步运行的方法和你的self.wxObservationStations不会受returnWxStation实际返回的时间进行填充。

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

相关问题