For-in 循环需要'[UserVehicles]?'符合'Sequence';你的意思是打开可选的? Swift
For-in loop requires '[UserVehicles]?' to conform to 'Sequence'; did you mean to unwrap optional? Swift
我有一个为 API returns 制作的数据模型,它是这样的:
struct VehicleData: Codable {
let _embedded: Embedded
}
struct Embedded: Codable {
let userVehicles: [UserVehicles]
}
struct UserVehicles: Codable {
let id: String
let images: [String]
let userId: String
let vehicle: Vehicle
let originalPrice: OriginalPrice
let hasBasicInsurance: Bool
}
我已经使用回调函数将其传递给我的 ViewController,现在我想在 useVehiclers 列表中查看,有多少车辆有基本保险。基本上,vehicleList?._embedded.userVehicles[i] = true
这是我使用ViewController中车辆数据的函数代码:
var vehicleManager = VehicleManager()
var vehicleList: VehicleData?
var i: Int = 0
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
vehicleManager.retrieveUserVehicle()
vehicleManager.onDataUpdate = { [weak self] (data: VehicleData) in
self?.useData(data: data)
}
tableView.dataSource = self
tableView.delegate = self
tableView.tableFooterView = UIView() //remove empty tableView cells
tableView.register(UINib(nibName: Constants.vehicleListCellNibName, bundle: nil), forCellReuseIdentifier: Constants.vehicleListToBeInsuredIdentifier)
}
func useData(data: VehicleData) {
vehicleList = data
// code below has issues....
for i in [vehicleList?._embedded.userVehicles] {
if let vechile = vehicleList?._embedded.userVehicles[i].hasBasicInsurance {
if vehicle == true {
i = i + 1
print(">>number of of insured vehidle: \(i)")
} else {
print(">>>number of of insured vehidle: \(i)")
}
}
}
}
你知道怎么解决吗?
您需要为可选值提供一个默认值,而不是强制解包
for i in vehicleList?._embedded.userVehicles ?? [] { }
从您的代码中看不清楚,但看起来 vehicleList
是可选的。它可能不应该(参见 Leo Dabus 的评论)。很少有有意义的可选数组。这表明空数组和缺失数组之间存在一些差异。如果有,那很好,但在大多数情况下,您应该只使用 non-optional 数组并将其设为空。
无论您是否修复该问题,解决此特定问题的方法是仅使用 non-optional 值,而您有一个:data
。所以将循环更改为:
for i in data._embedded.userVehicles { ... }
从你更新的问题中,你注意到“我想在 useVehiclers 列表中检查,有多少辆车有 BasicInsurance”。您似乎想将该值放入 i
。如果是这样,那就是:
func useData(data: VehicleData) {
vehicleList = data
i = data._embedded.userVehicles
.filter(\.hasBasicInsurance)
.count
}
您也可以为此使用 for_each 循环,例如:
vehicleList?._embedded.userVehicles.for_each(x in /*Do your thing here*/)
我有一个为 API returns 制作的数据模型,它是这样的:
struct VehicleData: Codable {
let _embedded: Embedded
}
struct Embedded: Codable {
let userVehicles: [UserVehicles]
}
struct UserVehicles: Codable {
let id: String
let images: [String]
let userId: String
let vehicle: Vehicle
let originalPrice: OriginalPrice
let hasBasicInsurance: Bool
}
我已经使用回调函数将其传递给我的 ViewController,现在我想在 useVehiclers 列表中查看,有多少车辆有基本保险。基本上,vehicleList?._embedded.userVehicles[i] = true
这是我使用ViewController中车辆数据的函数代码:
var vehicleManager = VehicleManager()
var vehicleList: VehicleData?
var i: Int = 0
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
vehicleManager.retrieveUserVehicle()
vehicleManager.onDataUpdate = { [weak self] (data: VehicleData) in
self?.useData(data: data)
}
tableView.dataSource = self
tableView.delegate = self
tableView.tableFooterView = UIView() //remove empty tableView cells
tableView.register(UINib(nibName: Constants.vehicleListCellNibName, bundle: nil), forCellReuseIdentifier: Constants.vehicleListToBeInsuredIdentifier)
}
func useData(data: VehicleData) {
vehicleList = data
// code below has issues....
for i in [vehicleList?._embedded.userVehicles] {
if let vechile = vehicleList?._embedded.userVehicles[i].hasBasicInsurance {
if vehicle == true {
i = i + 1
print(">>number of of insured vehidle: \(i)")
} else {
print(">>>number of of insured vehidle: \(i)")
}
}
}
}
你知道怎么解决吗?
您需要为可选值提供一个默认值,而不是强制解包
for i in vehicleList?._embedded.userVehicles ?? [] { }
从您的代码中看不清楚,但看起来 vehicleList
是可选的。它可能不应该(参见 Leo Dabus 的评论)。很少有有意义的可选数组。这表明空数组和缺失数组之间存在一些差异。如果有,那很好,但在大多数情况下,您应该只使用 non-optional 数组并将其设为空。
无论您是否修复该问题,解决此特定问题的方法是仅使用 non-optional 值,而您有一个:data
。所以将循环更改为:
for i in data._embedded.userVehicles { ... }
从你更新的问题中,你注意到“我想在 useVehiclers 列表中检查,有多少辆车有 BasicInsurance”。您似乎想将该值放入 i
。如果是这样,那就是:
func useData(data: VehicleData) {
vehicleList = data
i = data._embedded.userVehicles
.filter(\.hasBasicInsurance)
.count
}
您也可以为此使用 for_each 循环,例如:
vehicleList?._embedded.userVehicles.for_each(x in /*Do your thing here*/)