Не могу добавить элементы в массив - PullRequest
0 голосов
/ 27 марта 2019

У меня проблемы с массивом.Я создал массив с именем 'coins'

var coins = [Coin]()

, а затем добавил к нему объекты в функции

 func getCoinData() {
        AF.request("https://min-api.cryptocompare.com/data/top/mktcapfull?limit=10&tsym=USD", encoding: JSONEncoding.default).responseJSON { response in

            if let json = response.result.value{

                let responseDictionary = json as! [String : Any]
                let data = responseDictionary["Data"] as! [Any]

                for index in data {

                    let coin            = index as! Dictionary<String, Any>
                    let coinInfo        = coin["CoinInfo"] as! Dictionary<String, Any>
                    let displayInfo     = coin["DISPLAY"] as! Dictionary<String, Any>
                    let usdDisplayInfo  = displayInfo["USD"] as! Dictionary<String, Any>

                    let name            = coinInfo["Name"]
                    let fullName        = coinInfo["FullName"]
                    let imageUrl        = coinInfo["ImageUrl"]
                    let price           = usdDisplayInfo["PRICE"]
                    let marketCap       = usdDisplayInfo["MKTCAP"]
                    let change24Hr      = usdDisplayInfo["CHANGE24HOUR"]

                    let newCoin = Coin()

                    if let newCoinName = name, let newCoinFullName = fullName, let newCoinImageUrl = imageUrl, let newCoinPrice = price, let newCoinMarketCap = marketCap, let newCoinChange24hr = change24Hr {
                        let coinName        = newCoinName
                        let coinFullName    = newCoinFullName
                        let coinImageUrl    = newCoinImageUrl
                        let coinPrice       = newCoinPrice
                        let coinMarketCap   = newCoinMarketCap
                        let coinChange24Hr  = newCoinChange24hr

                        newCoin.name        = "\(coinName)"
                        newCoin.fullName    = "\(coinFullName)"
                        newCoin.imageURL    = "\(coinImageUrl)"
                        newCoin.price       = "\(coinPrice)"
                        newCoin.marketCap   = "\(coinMarketCap)"
                        newCoin.change24Hr  = "\(coinChange24Hr)"

                        self.coins.append(newCoin)
                    }
                }
            }
        }
    }

Когда я печатаю «self.coins.count» в рамках функцииЯ вижу увеличение количества.Вне функции она читает 0 элементов в массиве.

1 Ответ

1 голос
/ 27 марта 2019

Написано для Swift 5

Проблема в том, что у вас есть запрос URL, который Асинхронный .Это означает, что задача не ожидала завершения.

В вашей задаче внутри функции coins напечатано после того, как она была назначена, после запрос URL.Однако, когда coins печатается вне функции, оно печатается до того, как было изменено, так как запрос URL еще не завершен .

Чтобы решить эту проблему, вам нужно создать обработчик завершения.Здесь показан базовый:

// Our errors which could occur
enum SomeError: Error { case unknown }

// Function which is ASYNCHRONOUS
func someAsyncFunction(completion: @escaping (Result<Int, SomeError>) -> ()) {
    // Temporary for this example
    let success = true
    let myNum = 3

    // Return value if it is a success, otherwise return the error
    if success {
        completion(.success(myNum))
    } else {
        completion(.failure(.unknown))
    }
}


// Call
someAsyncFunction { (result) in
    print("Result:  \(result)")
    /* PRINT COINS HERE */
}

См. Полное руководство по обработчикам завершения, используя Result в Swift 5 в hackingwithswift.com.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...