我有一个包含多个单元格的UICollectionView。每个单元格都有一个包含以下数据的标签。
我想做的是,对于不是“A”或“B”的标签文本,我希望该值是基于单元格顺序的Int值。
例子
当前单元格标记文本:
A,A,3,B,5,A,B
我想要什么:
A,A,1,B,2,A,B
非常感谢您的帮助,非常感谢!!
代码:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! DataCell

        let integerArray = [Int](1...10)
        let sortedCellData = cellData.sorted { $0.key < $1.key}

        if String(Array(sortedCellData)[indexPath.row].value) == "A" {
            cell.valueLabel.text = "A"
        } else if String(Array(sortedCellData)[indexPath.row].value) == "B" {
            cell.valueLabel.text = "B"
        } else {
            cell.valueLabel.text = String(integerArray[indexPath.row])
        }
        return cell
    }
}

最佳答案

真奇怪。
此代码应该可以工作:

let array: [Any] = ["A", "A", 3, "B", 5, "A", "B", "N"]
var index = 0
let sorted = array.compactMap { (element) -> Any? in
    if let asString = element as? String, (asString == "A" || asString == "B") {
        return asString
    } else {
        index = index + 1
        return String(index)
    }
}
print("array: \(array)")
print("sorted: \(sorted)")

输出:
$>array: ["A", "A", 3, "B", 5, "A", "B", "N"]
$>sorted: ["A", "A", "1", "B", "2", "A", "B", "3"]

逻辑:
迭代元素:compactMap()
如果它是一个字符串,如果它等于“a”或“B”,则返回它(theif let asString
如果不是,让我们增加“索引”并将其作为String返回。
建议:在手动操作之前(加载UICollectionView之前)执行一次,不要在collectionView(_:cellForItemAt:)中执行一次,因为每次执行的计算都是相同的,这是不必要的、耗时的,而且由于是在主线程中执行的,因此可能会看到一些延迟。
现在,如果您保持sorted作为实例变量,则只需执行cell.valueLabel.text = sorted[indexPath.row]

10-07 13:36