For-in 循环需要“[UserVehicles]?”符合“顺序”;你的意思是解开可选的吗?迅速
Posted
技术标签:
【中文标题】For-in 循环需要“[UserVehicles]?”符合“顺序”;你的意思是解开可选的吗?迅速【英文标题】:For-in loop requires '[UserVehicles]?' to conform to 'Sequence'; did you mean to unwrap optional? Swift 【发布时间】:2021-01-31 20:44:29 【问题描述】:我有一个用于 API 返回的数据模型,它是这样的:
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,现在我想在 useVehicles 列表中查看有多少车辆有基本保险。基本上,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)")
你知道怎么解决吗?
【问题讨论】:
将您的数组声明更改为非可选并使用空集合对其进行初始化var vehicleList: [VehicleData] = []
感谢 Leo,我想我确实清楚地发布了问题,我再次编辑。 vehicleList 本身不是一个数组。 vehicleList._embedded.userVehicles
是一个数组。[]。这就是为什么要找到一种方法在 [] 内循环,并检查 vehicleList._embedded.userVehicles[I].hasBasicInsurance = true
typo.... 应该是*没有清楚地发布问题。
【参考方案1】:
您也可以为此使用 for_each 循环,例如:
vehicleList?._embedded.userVehicles.for_each(x in /*Do your thing here*/)
【讨论】:
【参考方案2】:从您的代码中不清楚,但看起来vehicleList
是可选的。它可能不应该是(参见 Leo Dabus 的 cmets)。拥有一个可选数组是很少见的。这表明空数组和缺失数组之间存在一些差异。如果有,那很好,但在大多数情况下,您应该只使用非可选数组并将其设为空。
无论你是否解决了这个问题,解决这个特定问题的方法是只使用一个非可选值,你有一个:data
。所以把循环改成:
for i in data._embedded.userVehicles ...
从您更新的问题中,您注意到“我想查看 useVehiclers 列表,有多少车辆有基本保险。”看来您想将该值放入i
。如果是这样,那就是:
func useData(data: VehicleData)
vehicleList = data
i = data._embedded.userVehicles
.filter(\.hasBasicInsurance)
.count
【讨论】:
谢谢 Rob,我想我确实清楚地发布了问题,我再次编辑。 vehicleList 本身不是一个数组。vehicleList._embedded.userVehicles
是一个数组。[]。这就是为什么要找到一种方法在 [] 内循环,并检查 vehicleList._embedded.userVehicles[I].hasBasicInsurance = true
typo.... 应该是 *没有清楚地发布问题。【参考方案3】:
你需要为 optional 提供一个默认值,而不是强制展开
for i in vehicleList?._embedded.userVehicles ?? []
【讨论】:
谢谢Sh_Khan,我想我确实清楚地发布了问题,我再次编辑。 vehicleList 本身不是一个数组。vehicleList._embedded.userVehicles
是一个数组。[]。这就是为什么要找到一种方法在 [] 内循环,并检查 vehicleList._embedded.userVehicles[I].hasBasicInsurance = true
typo.... 应该是 *没有清楚地发布问题。
亲爱的 Apple,您能否提供代码建议或至少更好地解释问题所在?谢谢!
这应该被标记为正确答案。以上是关于For-in 循环需要“[UserVehicles]?”符合“顺序”;你的意思是解开可选的吗?迅速的主要内容,如果未能解决你的问题,请参考以下文章