2017-02-22 39 views
0

Я работаю над учебником, и у меня есть вопрос о том, как мы получаем доступ к массивам в Swift. Мне было интересно узнать, что произойдет, если я буду использовать тип IndexPath напрямую, так как я предполагаю, что этот тип представляет путь к определенному узлу в дереве или массиве. Однако, следующая функция показывает ошибку на линии, которая возвращает, который говорит: "Cannot subscript value of type [ToDoItem] with an index of type IndexPath"Использование типа Int по сравнению с типом IndexPath в Swift

func item(at indexIWant: IndexPath) -> ToDoItem { 

     return toDoItems[indexIWant] 
    } 

Мне просто интересно узнать, что это означает в терминах непрофессионала, и почему это не приемлемо?

Вот код учебника и компиляции, который использует тип Int вместо типа IndexPath.

import Foundation 


class ItemManager { 

    var toDoCount: Int = 0 

    var doneCount: Int = 0 

    private var toDoItems: [ToDoItem] = [] 

    func add(_ item: ToDoItem) { 

     toDoCount += 1 

     toDoItems.append(item) 
    } 


    func item(at index: Int) -> ToDoItem { 

     return toDoItems[index] 

    } 
} 

ответ

3

Поскольку subscript ожидает Int и вы пропускание IndexPath, который не имеет типа Int.

Если вы посмотрите на Apple IndexPath Documentation, IndexPath имеет такие свойства, как row или section, которые типа Int. Вы можете использовать их для доступа к элементу из вашего массива.

func item(at indexIWant: IndexPath) -> ToDoItem { 
    return toDoItems[indexIWant.row] 
} 

Если вы действительно хотите получить доступ к массиву с IndexPath, вы можете расширить класс Array. Теперь ваш код компилируется, но я не уверен, рекомендую ли я этот код.

extension Array { 
    subscript(indexPath: IndexPath) -> Element { 
     get { 
      return self[indexPath.row] 
     } 
     set { 
      self[indexPath.row] = newValue 
     } 
    } 
} 
1

Класс NSIndexPath представляет собой путь к определенному узлу в дереве вложенных коллекций массива

enter image description here

так row является индексом массива п и section является номер массива поэтому первая стрелка указана из row 1 и section 0, вторая row 4 и section 1..and so на.

Doc