Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Alamofire for loop返回操场中的空阵列_Swift_Alamofire - Fatal编程技术网

Swift Alamofire for loop返回操场中的空阵列

Swift Alamofire for loop返回操场中的空阵列,swift,alamofire,Swift,Alamofire,我已经找了一个小时了,但我似乎还没弄明白。我认输了,然后问你 我有下面的游戏脚本,它打印一个空数组 我想在调用函数时返回一个自定义对象数组。我读到阿拉莫菲尔是一个不和谐的城市,但我真的不知道在这一点上该怎么做 提前谢谢 //: Playground - noun: a place where people can play import UIKit import Alamofire import SWXMLHash import PlaygroundSupport import Foundat

我已经找了一个小时了,但我似乎还没弄明白。我认输了,然后问你

我有下面的游戏脚本,它打印一个空数组

我想在调用函数时返回一个自定义对象数组。我读到阿拉莫菲尔是一个不和谐的城市,但我真的不知道在这一点上该怎么做

提前谢谢

//: Playground - noun: a place where people can play

import UIKit
import Alamofire
import SWXMLHash
import PlaygroundSupport
import Foundation


PlaygroundPage.current.needsIndefiniteExecution = true
URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)

class Tram {

    var arrivalInMinutes: Int?
    var tramDestinationEnglish: String?

    init(destination: String, arrivalTime: Int) {
        tramDestinationEnglish = destination
        arrivalInMinutes = arrivalTime

    }
}

func retrieveListOfTrams() -> [Tram] {

    var anyArray = [Tram]()

    Alamofire.request("https://hktramways.com/nextTram/geteat.php?stop_code=08W")
        .response { (response) in

            let xmlData = SWXMLHash.parse(response.data!)

            for elem in xmlData["root"]["metadata"].all {
                let tramArrival = elem.element!.attribute(by: "arrive_in_minute")!.text
                let tramDestination = elem.element!.attribute(by: "tram_dest_en")!.text
                anyArray.append(Tram(destination: tramDestination, arrivalTime: Int(tramArrival)!))

                }

            }
    return anyArray


}

print(retrieveListOfTrams())

问题是,您在请求返回结果之前返回数组,因为读取Alamofire时有一个异步行为。解决此问题的一种方法是使用一个只在结果到达后返回数组的完成块:

func retrieveListOfTrams(completion: @escaping ([Tram]) -> Void) {

    var anyArray = [Tram]()

    Alamofire.request("https://hktramways.com/nextTram/geteat.php?stop_code=08W")
        .response { (response) in

            let xmlData = SWXMLHash.parse(response.data!)

            for elem in xmlData["root"]["metadata"].all {
                let tramArrival = elem.element!.attribute(by: "arrive_in_minute")!.text
                let tramDestination = elem.element!.attribute(by: "tram_dest_en")!.text
                anyArray.append(Tram(destination: tramDestination, arrivalTime: Int(tramArrival)!))

                }


            completion(anyArray)
            }   

}
然后可以调用该函数:

retrieveListOfTrams(completion: { anyArray in
    print(anyArray.description)
})

谢谢-但现在我遇到了:Playerd执行失败:错误:Playerd。Playerd:36:13:错误:使用非转义参数“completion”的闭包可能允许它转义completionanyArray^Playerd。Playerd:19:26:注:参数“completion”是隐式非转义函数retrieveListOfTramscompletion:[Tram]>Void{^@escapingI找到了答案:func retrieveListOfTramscompletion:@escaping[Tram]>Void