Swift - отсутствует метка аргумента 'where:' в вызове, но исправление приводит к ошибке "невозможно преобразовать значение типа Bool в ожидаемую" - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь получить доступ к проанализированным данным JSON в операторе if, и выводится следующая ошибка:

Отсутствует метка аргумента 'where:' в вызове

КогдаЯ исправляю ошибку, нажимая fix, и появляется следующая ошибка:

Невозможно преобразовать значение типа 'Bool' в ожидаемый тип аргумента '(Status) throws -> Bool'

Вот код:

import UIKit
import Foundation

// JSON parsing
struct Welcome: Decodable {
    let greeting: String
    let instructions: [Instruction]
}
struct Instruction: Decodable {
    let statuses: [Status]
    let message, messageURL: String
    let status: Bool
    let load, time: Int

    enum CodingKeys: String, CodingKey {
        case statuses, message
        case messageURL = "message_url"
        case status, load, time
    }
}
struct Status: Decodable {
    let title: String
    let code: Int
    let status: Bool
    let time: Int
}

//main class
class ViewController: UIViewController {

    //Hides the status bar
    override var prefersStatusBarHidden: Bool {
        return true
    }

    //Storyboard controllers
    @IBOutlet weak var downImage: UIImageView!
    @IBOutlet weak var upImage: UIImageView!

    //The meat of the program
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let url = "https://issteamdown.com/status.json"
        let urlObj = URL(string: url)

        URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
            guard let data = data else { return }
            do {
                let json = try JSONDecoder().decode(Instruction.self, from: data)
                json.statuses.forEach { status in
                    if !json.statuses.contains(where: false) {
                        print("all true")

                        // show the image view
                        self.upImage.isHidden = false
                    }
                }
            } catch {
                print(error)
            }

        }.resume()
    }
}

Если кто-то может помочь мне с этой ошибкой, я был бы очень признателен.Я пробовал искать, но решения, предлагаемые схожими вопросами, не кажутся очень полезными, или я не реализую их правильно.

Если бы кто-то мог помочь мне понять, что здесь происходит, это было бы фантастическиим.

Заранее спасибо!

1 Ответ

0 голосов
/ 27 сентября 2018

contains(where:) ожидает закрытие, которое возвращает bool:

if !json.statuses.contains(where: {$0.status == false}) {
    print("all true")
    self.upImage.isHidden = false
}

json.statuses - это массив типа [Status], и вы хотите проверить, нет ли элементаэтот массив имеет status == false.


. Как отмечено в комментариях @ MartinR , вы можете более элегантно написать приведенное выше условие так:

if json.statuses.allSatisfy ({ $0.status }) {
    print("all true")
    self.upImage.isHidden = false
}

Чтобы узнать больше о крышках, посмотрите здесь .

...