2016-02-18 1 views

ответ

1

Так другие ответы определить, что индексирование в целом, но из названия вашего поста, я предполагаю, что вы спрашиваете, что линия

return self[indexPath.section][indexPath.row] 

делает.

Это довольно просто, он применяет индекс к self, а затем еще один индекс результата. Эта функция

public subscript(indexPath: NSIndexPath) -> BaseRow { 
    return self[indexPath.section][indexPath.row] 
} 

определяет индекс на NSIndexSet с точки зрения других уже определенных индексов. section свойство NSIndexSet является ИНТ, и вы увидите, что класс Form определяет индекс на Int в этом расширении:

extension Form : MutableCollectionType { 

    // MARK: MutableCollectionType 

    public var startIndex: Int { return 0 } 
    public var endIndex: Int { return kvoWrapper.sections.count } 
    public subscript (position: Int) -> Section { 
     get { return kvoWrapper.sections[position] as! Section } 
     set { kvoWrapper.sections[position] = newValue } 
    } 
} 

Так self[indexPath.section] возвращает Section объект, который затем индексируются другим междунар (indexPath.row) для возврата BaseRow (см. ниже, чтобы увидеть индекс Int на Section).

2

Добавление этого метода к классу или структуры

public subscript (index: Int) -> Element { 
    // ... 
} 

это позволяет использовать индексацию с собственным классом.

Пример

public class Sentence { 

    private let words: [String] 

    init(sentence:String) { 
     self.words = sentence.characters.split(" ").map(String.init) 
    } 

    public subscript (index: Int) -> String { 
     return words[index] 
    } 
} 

let sentence = Sentence(sentence: "Hello world") 
sentence[0] // "Hello" 
//  ^<-- this will call the subscript method 
2

К documentation

подстрочные

Классы, структуры и перечислений можно определить индексы, которые являются> ярлыки для доступа к элементам элемент коллекции , список, или последовательность. Вы используете индексы для установки и извлечения значений по индексу без необходимости использования отдельных методов настройки и поиска. Например, для примера можно получить доступ к элементам экземпляра Array как someArray [index] и элементам экземпляра словаря как someDictionary [key].

Вы можете определить несколько индексов для одного типа и выбрать соответствующую перегрузку подстроки в зависимости от типа значения индекса , которое вы передаете в индекс. Подстроки не ограничиваются одним измерением , и вы можете определить индексы с несколькими входными параметрами в соответствии с потребностями вашего пользовательского типа.

• struct TimesTable { 
     let multiplier: Int 
     subscript(index: Int) -> Int { 
      return multiplier * index 
     } 
    } 

let threeTimesTable = TimesTable(multiplier: 3) 

println("six times three is \(threeTimesTable[6])") 

// prints "six times three is 18"