如何从元组数组中找到元组元素的索引?iOS,Swift

4

这是在tableview的cellforrowatindexpath方法内部

    var valueArray:[(String,String)] = []
    if !contains(valueArray, v: (title,status)) {
                let v = (title,status)
                valueArray.append(v)
            }

这是在didselectrowatIndexPath中的内容

    let cell = self.tableView.cellForRowAtIndexPath(selectedRow!)
    var newTuple = (cell!.textLabel!.text!, cell!.detailTextLabel!.text!)
    let index = valueArray.indexOf(newTuple)

但我没有得到索引。它会抛出一个错误,无法将类型为'(String, String)'的值转换为预期的参数类型'@noescape ((String, String)) throws -> Bool'。我在这里做错了什么?


我觉得你的问题是Swift不知道如何原生地比较你的tuple是否相等。看这里:https://dev59.com/2mAf5IYBdhLWcg3wlDib - sschale
1
不要将元组存储在数组中,应该创建一个结构体或对象。同时,需要考虑相等性测试。 - Paulw11
另外,为什么valueArray(selectedRow)不是你想要的那个? - Paulw11
@Paulw11 我没听懂你的意思。 - Swayambhu
@sschale 是的,我知道这个问题,所以正在尝试找到解决方案。 - Swayambhu
2个回答

17

元组可以进行相等性比较(自Swift 2.2/Xcode 7.3.1以来),但它们不符合Equatable协议。因此,您必须使用基于谓词的变体的indexOf来定位数组中的元组。例如:

let valueArray = [("a", "b"), ("c", "d")]
let tuple = ("c", "d")
if let index = valueArray.indexOf({ $0 == tuple }) {
    print("found at index", index)
}
在 Swift 4 中,该方法已更名为 firstIndex(where:)
if let index = valueArray.firstIndex(where: { $0 == tuple }) {
    print("found at index", index)
}

如果我们使用else语句,实际上它也可以像包含函数一样工作 ;) - Abu Ul Hassan

6

这是我找到元组索引的方法:

var tuple: [(key: String, value: AnyObject)] = [("isSwap", true as AnyObject), ("price", 120 as AnyObject)]
if let index = tuple.index(where: {($0.key == "price")}) {
    print(index)
}
//prints 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接