我想用我的
var savings = Set<Saving>()
作为我的UITableView中的数据源。
我不能使用像
这样的东西cell.name = savings[indexPath.row].name
因为下标只是保存。有没有办法做到这一点呢?
答案 0 :(得分:1)
我相信你所寻找的是:
var savings = Array<Saving>()
然后将其称为
cell.name = savings[indexPath.row].name
<强>更新强>
如果您节省了Set
。你可以从中获取数组并使用它:
let savingsArray = Array(savings)
然后将其称为
cell.name = savingsArray[indexPath.row].name
答案 1 :(得分:1)
Set本质上是无序的,但是UITableViewDataSource实现需要具有已定义的顺序。您必须将该集转换为数组(具有已定义的顺序)并使用它来实现数据源方法。
答案 2 :(得分:1)
我首先应该提一下,在这种情况下,Set
可能不是最好的收集类型,因为 - 比尔--- Set
提到的本身就是无序的。
但是,您可以通过将name
类中的Saving
整数属性与整数indexPath.row
属性相匹配来访问id
实例的Saving
属性/ structure,使用Set
方法.filter(...)
。
考虑以下示例。我们首先创建符合Saving
和Hashable
协议的Equatable
结构(或我收集的类),以符合作为集合类型Set
的成员的条件:
/* Saving: conform to Hashable and Equatable for use as
collection type Set members */
struct Saving : Hashable {
var id: Int
var name: String
/* Make Saving conform to Hashable */
var hashValue: Int {
return self.id
}
init(id: Int, name: String) {
self.id = id
self.name = name
}
}
/* Make Saving conform to Equtable */
func ==(lhs: Saving, rhs: Saving) -> Bool {
return lhs.id == rhs.id
}
现在,请考虑以下示例,在给定整数ID的情况下访问Set
(类型为Saving
)的特定成员,例如例如表视图中的相应行索引(indexPath.row
):
/* Example */
var savings = Set<Saving>()
savings.insert(Saving(id: 1, name: "Savings A"))
savings.insert(Saving(id: 2, name: "Savings B"))
savings.insert(Saving(id: 3, name: "Savings C"))
let indexPathRow = 1 // for our example
var cellName = savings.filter({ $0.id == indexPathRow }).first?.name ?? "No such Savings id"
print(cellName) // Savings A
或者,通过.name
提取创建.id
作为函数。
func getSavingsName(mySavingsSet: Set<Saving>, myId: Int) -> String {
return mySavingsSet.filter({ $0.id == myId }).first?.name ?? "No such Savings id"
}
/* for your specific example */
cell.name = getSavingsName(savings, myId: indexPath.row)
最好使用可选返回来处理案例“没有这样的保存ID”,以避免在(尝试)找到与行id对应的Set
成员时遇到任何未确定的行为:你的桌面视图。