将“类变量”分配给'lazy var'

时间:2016-04-19 08:56:44

标签: ios arrays swift uicollectionview lazy-initialization

我试图了解可拖动集合视图单元格的逻辑。它适用于虚拟数据但是,我无法弄清楚如何使它与真实数据一起工作。

我无法知道该问题的标题,请随时修改/改进

如果我将这种方法与虚拟数组项一起使用并调用函数

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
            ...
  

实例成员realImages不能用于TableViewController类型

在这种情况下使用我的真实阵列的正确方法是什么?

This explanationits Git repo非常适合理解它)。我用虚拟数据进一步简化了它,但是我无法理解'lazy var'和常规'var'的逻辑以及如何使它在这种情况下工作

1 个答案:

答案 0 :(得分:1)

您需要像let images = self.realImages一样明确使用自我。

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

(注意我们不得不在这里说[无主自我]以防止strong reference cycle