每16个灰色项追加2个红色项,如何计算CollectionView总条目数?
解决CollectionView总条目数计算问题
需求说明
用户选择1-1000之间的整数作为灰色条目数量,CollectionView中每16个灰色条目后需添加红色框,最终列表首尾都要有红色框。例如选择33个灰色条目时,需显示5个红色条目+33个灰色条目,总条目数为38。
当前代码问题
你提供的代码存在两处明显错误:
userChosenValue是Int类型,不存在count属性,这里直接使用userChosenValue即可- 红色条目数的计算逻辑错误,原公式
((userChosenValue * 2) + 1) / 18完全不符合需求规则
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { let userChosenValue = Int(settingsArray[0].userChosenValue) var redItemValue = ((userChosenValue * 2) + 1) / 18 return userChosenValue.count + redItemValue }
修正方案
逻辑推导
根据需求和示例,红色条目数的计算规则:
- 把灰色条目按16个一组划分,不足16个的单独算一组
- 红色条目数 =
2 × 组数 - 1(组数为灰色条目数向上取整除以16的结果)
用整数除法实现的话,可以写成:1 + 2 × ((userChosenValue - 1) / 16),利用整数除法自动向下取整的特性,避免浮点运算。
修正后的代码
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { // 安全转换字符串为整数,同时校验数值范围 guard let userChosenStr = settingsArray[0].userChosenValue, let userChosenValue = Int(userChosenStr), userChosenValue >= 1, userChosenValue <= 1000 else { return 0 // 不符合要求时返回0,可根据实际需求调整默认值 } // 计算红色条目数量 let redItemCount = 1 + 2 * ((userChosenValue - 1) / 16) // 总条目数 = 灰色条目数 + 红色条目数 return userChosenValue + redItemCount }
验证示例
- 当
userChosenValue = 33时:(33-1)/16 = 2,redItemCount = 1 + 2×2 = 5,总条目数33+5=38,完全符合需求 - 当选择16个灰色条目:
(16-1)/16=0,redItemCount=1,总条目17 - 当选择1个灰色条目:
redItemCount=1,总条目2
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

