【问题标题】:For-in loop requires '[UserVehicles]?' to conform to 'Sequence'; did you mean to unwrap optional? SwiftFor-in 循环需要“[UserVehicles]?”符合“顺序”;你的意思是解开可选的吗?迅速
【发布时间】: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.... 应该是*没有清楚地发布问题。

标签: ios swift list for-loop for-in-loop


【解决方案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,您能否提供代码建议或至少更好地解释问题所在?谢谢!
    • 这应该被标记为正确答案。
    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2016-07-11
    • 2023-01-08
    • 1970-01-01
    • 2010-09-21
    • 2016-11-27
    相关资源
    最近更新 更多