Swift-调用中缺少参数标签“ where:”,但修复后导致“无法将Bool类型的值转换为预期值”错误

时间:2018-09-27 15:11:58

标签: json swift parsing conditional

我正在尝试在if语句中访问已解析的JSON数据,并且它输出以下错误:

  

在调用中缺少参数标签'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 :(得分:2)

contains(where:)期望闭包返回布尔值:

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
}

要了解有关闭包的更多信息,请查看here