Подтвердить что ты не робот

Сравнение 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 сравнивает свойства раздела и строки вместо экземпляра.

4b9b3361

Ответ 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. Поэтому вы можете использовать операторы == или !=, чтобы сравнить два экземпляра.