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]?”符合“顺序”;你的意思是解开可选的吗?迅速的主要内容,如果未能解决你的问题,请参考以下文章

Python for-in Loop常见遍历方法

javascript中for循环和for-in循环的区别

python 循环结构(for-in)

在 for-in 循环中进行类型转换

python基础四

python之range()函数for-in循环和while循环