2016-04-19 3 views
1

Я пытаюсь понять логику перетаскиваемых элементов просмотра коллекции. Однако он работает с фиктивными данными, но я не мог понять, как заставить его работать с реальными данными.Назначение переменной класса переменной «lazy var»

Я не мог знать, что название, чтобы дать на этот вопрос, пожалуйста, не стесняйтесь редактировать/улучшить его

Если я использую этот подход с соской элементов массива и вызвать функцию

class TableViewController: UITableViewController, KDRearrangeableCollectionViewDelegate, UICollectionViewDataSource { 

lazy var data : [[String]] = { 

    var array = [[String]]() 

    let images = [ 
     "1.jpg", "2.jpg", "3.jpg" 
    ] 

    if array.count == 0 { 

     var index = 0 
     var section = 0 

     for image in images { 
      if array.count <= section { 
       array.append([String]()) 
      } 
      array[section].append(image) 

      index += 1 
     } 
    } 
    return array 
}() 

func moveDataItem(fromIndexPath : NSIndexPath, toIndexPath: NSIndexPath) { 
    let name = self.data[fromIndexPath.section][fromIndexPath.item] 
    self.data[fromIndexPath.section].removeAtIndex(fromIndexPath.item) 
    self.data[toIndexPath.section].insert(name, atIndex: toIndexPath.item) 

    print(self.data) 
} 

На этом этапе print(self.data) печатает новый порядок элементов массива после перетаскивания/перестановки.

Пример print(self.data) журнал: [["2.jpg", "1.jpg", "3.jpg"]]


Теперь у меня есть реальные данные, как и добавляемые пункты после извлечения из базы данных .. член

var realImages = [NSURL]() 

// I tried assigning `images` array inside `lazy var data` but received error: 

lazy var data : [[String]] = { 
    var array = [[String]]() 
    let images = realImages // error here 
      ... 

Instance realImages нельзя использовать для типа TableViewController

Каков правильный способ использования моего реального массива в этом случае?


(This explanation и its Git repo было большим для ее понимания). Я еще более упростил его с помощью фиктивных данных, но я не мог понять логику «ленивого вар» и регулярного «var» и как заставить его работать в этом сценарии.

+0

Возможный дубликат [ «член Instance не может быть использован по типу» ошибки в ленивой собственности] (Http://stackoverflow.com/questions/35990637/i-want-put-an-array-to-an-array-but-why-do-i-get-this-error) – Hamish

ответ

1

Вам нужно использовать self явно, как let images = self.realImages.

lazy var data : [[String]] = { [unonwed self] in 
    var array = [[String]]() 
    let images = self.realImages // error gone :) 

(Обратите внимание, что мы должны были сказать [бесхозный себя] здесь, чтобы предотвратить strong reference cycle)

+1

На самом деле вам не нужно использовать 'unowned 'или' weak' на 'self' здесь. Ленивые переменные не генерируют сильные ссылочные циклы, поскольку они создаются только один раз. После того, как они называются, результат закрытия не сохраняется, а не сама горловина - поэтому нет сильного опорного цикла. Даже если вы их не называете, они достаточно умны, чтобы не ссылаться на «самоуверенность» - вы можете проверить это на игровой площадке. – Hamish

Смежные вопросы