Swift 3:查找索引并从Structs数组中的数组中删除一个项目

时间:2017-09-01 19:24:37

标签: arrays swift indexing struct

我使用struct来填充带有节和行的表视图控制器。现在我需要从表中删除一个单元格。如何找到列表中的元素以将其删除?

STRUCT:

struct Cells {
    var section: String!
    var list: [String]!
}

部分和行

var tableStructure = [Cells(section: "Requests", list: ["uidU", "uidV"])]

在结构中搜索我要从列表中删除的元素,从结构列表中删除项目然后从表视图中删除单元格的代码:

let index = tableStructure.index(where: {$0.section == "Requests" && list.index{$0 == cell.selectedUserUid} as Any as! Bool})
self.tableStructure.remove(at: index!) //***ERROR HERE***
tableView.deleteRows(at: [indexPath], with: .fade)

错误消息:

fatal error: unexpectedly found nil while unwrapping an Optional value

我设置了一个断点来查看“cell.selectedUserUid”的内容,它等于我想从struct中删除的元素。

连连呢?谢谢!

1 个答案:

答案 0 :(得分:5)

index的结果始终是Int?,这意味着它可以是Intnil,但绝不是Bool(顺便说一句 {{ 1}} 是一种可怕的语法。)

您可能想要这个(as Any as! Bool数组包含list

Uid

应该 必须安全地写

tableStructure.index(where: {$0.section == "Requests" && $0.list.contains(cell.selectedUserUid)})

修改

您的设计无法运作。您将删除整个非意图的部分。在您的结构中添加一个变异函数(或使用一个类)来删除if let index = tableStructure.index(where: {$0.section == "Requests" && $0.list.contains(cell.selectedUserUid)}) { self.tableStructure.remove(at: index) tableView.deleteRows(at: [indexPath], with: .fade) } 中的特定。然后重新创建相应的list。如果数组为空,则可以删除该部分。

重要提示:

永远不会将类/结构中的属性/成员声明为隐式展开的选项,这些选项将使用indexPath方法进行初始化。如果您想要使用常规可选项(init),则使用非可选项(不是??