2

我有以下课程来返回 NOAA 气象观测站的列表。我正在使用它来学习如何处理 XML。但是,我在 func returnWxStation() -> (wxObservationStations) 处收到“使用未声明的类型 'wxObservationStations'”作为错误。我正在使用 SWXMLHash 反序列化 XML,但我认为这不是我的问题(虽然我只是在学习,所以可能是这样)。

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
}
}

有什么想法吗?该变量在类中声明,我想使用它将数据发送回请求对象。提前致谢。

4

1 回答 1

1

thewxObservationStations不是类型,所以说没有意义

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

你正在返回self.wxObservationStations,它的类型是[wxStation]。所以方法声明应该是

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

顺便说一句,如果你坚持 Cocoa 命名约定,你的生活会更轻松,即类型应该以大写字母开头。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
于 2016-12-24T18:16:21.530 回答