Сравнение NSIndexPath Swift
Если у меня есть константа NSIndexPath, объявленная для UITableView, допустимо ли сравнивать ее с помощью оператора ==
?
Это мое постоянное объявление:
let DepartureDatePickerIndexPath = NSIndexPath(forRow: 2, inSection: 0)
И затем моя функция:
override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
var height: CGFloat = 45
if indexPath == DepartureDatePickerIndexPath{
height = departureDatePickerShowing ? 162 : 0
} else if indexPath == ArrivalDatePickerIndexPath {
height = arrivalDatePickerShowing ? 162 : 0
}
return height
}
Это, безусловно, работает правильно, но безопасно ли это делать? Я предполагаю, что, поскольку он работает, оператор ==
объекта NSIndexPath сравнивает свойства раздела и строки вместо экземпляра.
Ответы
Ответ 1
Проделайте очень простой тест:
import UIKit
var indexPath1 = NSIndexPath(forRow: 1, inSection: 0)
var indexPath2 = NSIndexPath(forRow: 1, inSection: 0)
var indexPath3 = NSIndexPath(forRow: 2, inSection: 0)
var indexPath4 = indexPath1
println(indexPath1 == indexPath2) // prints "true"
println(indexPath1 == indexPath3) // prints "false"
println(indexPath1 == indexPath4) // prints "true"
println(indexPath1 === indexPath2) // prints "true"
println(indexPath1 === indexPath3) // prints "false"
println(indexPath1 === indexPath4) // prints "true"
Да, безопасно использовать ==
с NSIndexPath
В качестве примечания, ==
в Swift всегда используется для сравнения значений. ===
используется для обнаружения, когда две переменные ссылаются на один и тот же экземпляр. Интересно, что indexPath1 === indexPath2
показывает, что NSIndexPath создан для совместного использования одного и того же экземпляра всякий раз, когда значения совпадают, поэтому даже если вы сравнивали экземпляры, он все равно будет действительным.
Ответ 2
С помощью Swift вы можете использовать NSIndexPath
или IndexPath
. Обе стратегии имеют одинаковую стратегию.
# 1. NSIndexPath
Согласно документации Apple, NSIndexPath
соответствует Equatable
. Поэтому вы можете использовать операторы ==
или !=
для сравнения двух экземпляров NSIndexPath
.
# 2. IndexPath
Документация Apple содержит сведения о NSIndexPath
и IndexPath
:
Наложение Swift на фреймворк основывает структуру IndexPath
, которая соединяется с классом NSIndexPath
.
Это означает, что в качестве альтернативы NSIndexPath
, начиная с Swift 3 и Xcode 8, вы можете использовать IndexPath
. Обратите внимание, что IndexPath
также соответствует протоколу Equatable
. Поэтому вы можете использовать операторы ==
или !=
, чтобы сравнить два экземпляра.