在Swift 3中使用未声明类型

时间:2016-12-24 17:36:42

标签: ios xml swift3 swxmlhash

我有以下课程返回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
}
}

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

1 个答案:

答案 0 :(得分:1)

wxObservationStations不是一种类型,所以说

是没有意义的
func returnWxStation() -> (wxObservationStations) { ... }

您返回的self.wxObservationStations [wxStation]类型func returnWxStation() -> [wxStation] { ... } 。所以方法声明应该是

wxStation

顺便说一句,如果你坚持使用Cocoa命名约定,你的生活会更容易,即类型应该以大写字母开头。因此,我建议使用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

你可以像这样使用它:

rails c
Movie.new