如何使用自定义对象作为数据源的Set类型

时间:2015-12-31 14:42:04

标签: ios swift

我想用我的

var savings = Set<Saving>()

作为我的UITableView中的数据源。

我不能使用像

这样的东西
cell.name = savings[indexPath.row].name

因为下标只是保存。有没有办法做到这一点呢?

3 个答案:

答案 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(...)

考虑以下示例。我们首先创建符合SavingHashable协议的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成员时遇到任何未确定的行为:你的桌面视图。