确定排序后是否更改了数组

时间:2015-08-07 03:36:48

标签: ios arrays swift

我想确定是否应该重新加载TableView。当它出现时,我会根据名称进行简单的排序。

我可以使用dataSource中的更多或更少的项目或数据源中需要重新排序单元格的更改项目来回到此视图。即,名称从Foo更改为Bar,因此订单更改。

如何在使用Swift排序方法后确定是否发生了列表突变?我正在寻找类似的东西

let orderDidChange = clientList.sort({ $0.clientName < $1.clientName })

这是我目前的代码

override func viewWillAppear(animated: Bool) {

    super.viewWillAppear(animated)

    let originalList = clientList
    orderHasChanged = false

    clientList.sort({ $0.clientName < $1.clientName })
    clientList.sort({ $0.isBase > $1.isBase })

    orderHasChanged = clientList != originalList

    if orderHasChanged {
        // always enters here
        println("changed")
        tableView.beginUpdates()
        tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: UITableViewRowAnimation.Fade)
        tableView.endUpdates()
    }
    else {
        println("same do nothing")
    }

}

2 个答案:

答案 0 :(得分:2)

实际上,您可以使用==运算符检查旧数组是否等于已排序的数组。如果两个数组包含相同的数据,但顺序不同,则它们不相等。

例如,

let bar: [String] = ["Hello", "World"]
let foo: [String] = ["Hello", "World"]

//this will print "true"
//bar and foo contain the same data in the same order
print(bar == foo)


let bar: [String] = ["Hello", "World"]
let foo: [String] = ["World", "Hello"]

//this will print "false"
//bar and foo contain the same data, but in a different order
print(bar == foo)

所以,这样的事情会起作用

let originalList = clientList
clientList.sort({ $0.clientName < $1.clientName })

let orderHasChanged = clientList != originalList

答案 1 :(得分:0)

这是我能想到的最短的。首先,您需要添加一个标志作为属性,然后使用下面的修改排序,根据排序是否发生,设置标志。如果hasBeenSorted然后重新加载你的tableView。

//private property
var hasBeenSorted = false

//var names = [3, 1, 4, 2]
var names = [1, 2, 3, 4]

names.sort({
    let isLess = $0 < $1

    //binary OR since we are interested only when it is true
    hasBeenSorted = isLess || hasBeenSorted 

    return isLess
})

hasBeenSorted //false