我正在尝试在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()
}
}
如果有人可以帮助我解决此错误,我将非常感谢。我已经尝试过搜索,但是类似问题所提供的解决方案似乎并没有太大帮助,或者我没有正确实现它们。
如果有人可以帮助我了解这里发生的事情,那对他们来说太棒了。
谢谢!
答案 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。