Почему свойства `var row: Int` и `var section: Int` из `IndexPath` дают сбой при использовании пользовательского инициализатора?

Необходимо добавить свойство subrow: Int к IndexPath. Почему происходит сбой свойств row: Int и section: Int?

import UIKit 

extension IndexPath {
    init(subrow: Int, row: Int, section: Int) {
        self.init(indexes: [section, row, subrow])
    }
    var subrow: Int {
        get { return self[2] }
        set { return self[2] = newValue }
    }
}

let ip = IndexPath(subrow: 0, row: 1, section: 2)
print(ip.subrow == 0) // OK
print(ip.row == 1) // Crash!
print(ip.section == 2) // Crash!

person Alex Bishop    schedule 08.10.2017    source источник
comment
Обратите внимание, что оператор return в установщике является избыточным.   -  person Martin R    schedule 08.10.2017


Ответы (1)


Свойства row и section определены в расширении IndexPath в структуре UIKit. Это «удобные» средства доступа, предназначенные для использования с табличными представлениями или представлениями коллекций.

Из документации API видно, что их можно использовать только с путями индекса, содержащими ровно два элемента:

extension IndexPath {

    /// Initialize for use with `UITableView` or `UICollectionView`.
    public init(row: Int, section: Int)

    /// The section of this index path, when used with `UITableView`.
    ///
    /// - precondition: The index path must have exactly two elements.
    public var section: Int

    /// The row of this index path, when used with `UITableView`.
    ///
    /// - precondition: The index path must have exactly two elements.
    public var row: Int
}

См. также исходный код по адресу UIKit_FoundationExtensions. swift.gyb.

Вместо этого вы можете использовать метод индекса:

let ip = IndexPath(subrow: 0, row: 1, section: 2)

print(ip[0]) // 2
print(ip[1]) // 1
print(ip[2]) // 0
person Martin R    schedule 08.10.2017
comment
Но как обойти это ограничение? - person Alex Bishop; 08.10.2017
comment
@AlexBishop: этого нельзя избежать, потому что предварительное условие встроено в структуру. Вы можете использовать методы доступа нижнего индекса или определить свои собственные свойства myrow, mysection - person Martin R; 08.10.2017