首页 > 解决方案 > 无法将结构变量设为可变类型

问题描述

我面临“无法分配给'Bool'类型的不可变表达式”的问题。请看下面的代码。我在viewForHeaderInSection. 实际上我应该在哪里进行修改以使其工作?

struct VenueDetail {
        var isVeg: Bool
}

struct VenueDetailDTOMapper {

    static func map(_ dto: DetailDataDTO) -> VenueDetail {
     return VenueDetail(isVeg: dto.isVeg)
    }
}

在 API Manager 中,我从 api 获取数据并使用上面的结构如下

let venueDetail = VenueDetailDTOMapper.map(getDetail)

视图模型:

enum VenueDetailVMTypes {
    case veueInfoInfo
}

protocol VenueDetailVMItems {
 var type: VenueDetailVMTypes { get }
}

struct VenueInfoViewModel: VenueDetailVMItems {
        var type: VenueDetailVMTypes {
            return .veueInfoInfo
            }
        var headerSection: VenueDetail
}

func cretaDataSource() {

    if let getVenueDetails = self.venueDetails {
        let vmType = VenueInfoViewModel(headerSection: getVenueDetails)
        arrayDataSource.append(vmType)
    }
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

       let headerView = UIView()

       let venueDetailVMItems = viewModel.arrayDataSource[section]
       switch venueDetailVMItems.type {
       case .veueInfoInfo:
           let headerCell = tableView.dequeueReusableCell(withIdentifier: kCellIdentifierVenueHeader) as! VenueHeaderTVCell
           headerCell.updateCellData(detail: (venueDetailVMItems as! VenueInfoViewModel).headerSection)

           headerCell.foodTypeHandler = { [weak self] (isOn) in
               guard let strongSelf = self else {
                   return
               }                
            strongSelf.viewModel.showOnlyVegMenu(shouldShowVeg: isOn)
            (venueDetailVMItems as! VenueInfoViewModel).headerSection.isVeg = isOn.  //Cannot assign to immutable expression of type 'Bool'
            strongSelf.tableView.reloadData()
           }
           headerView.addSubview(headerCell)
           break
       }
       return headerView
}

标签: iosstructexpressionimmutabilityswift5

解决方案


结构是字段的聚合;如果特定结构实例是可变的,则其字段将是可变的;如果一个实例是不可变的,那么它的字段也是不可变的。因此,必须为任何特定实例的字段可能是可变或不可变的可能性准备结构类型。

请检查这个

所以试着把let改成var

确保arrayDataSource是可变的用户变量不允许

var arrayDataSource = [VenueInfoViewModel]()

推荐阅读