Swift函数返回数组参考

时间:2017-05-18 19:01:26

标签: arrays swift

我对Swift相当新,所以要温柔......

我有一个名为ProgramOptions的类,如下所示:

class ProgramOptions {
   var startDate: Date = Date()
   var trackedActivities = [TrackedItem]()
   var trackedFoods = [TrackedItem]()
   var trackedDrugs = [TrackedItem]()
   ...
}

TrackedItem是我的另一类。

在TableViewController的代码中,我想根据表中的哪个部分选择ProgramOptions实例中的一个数组。我想做很多可能的事情,比如删除或添加项目,编辑它们等等。

作为Swift的初学者,我天真地写了这个函数:

func trackedArrayForSection(_ section: Int) -> [TrackedItem]? {
      switch(section) {
         case 1:     return programOptions.trackedActivities
         case 2:     return programOptions.trackedFoods
         case 3:     return programOptions.trackedDrugs
         default:    return nil
      }
   }

(第0节和第3节没有关联数组,所以我返回nil)

然后严酷的现实让我感到困惑。我猜数组是副本。 (或者我对StackOverflow上类似问题的理解不足,表明有时>已复制。)

所以这就是你的问题......我怎么能写出我的trackedArrayForSection,以便我得到一个对ProgramOptions中实际数组的引用,然后我可以添加和删除项目?

当然,我可以在每个使用它的地方都有一个开关声明,但是它们中有很多,我想避免这种情况。我假设有一个简单的答案,我现在太无知了解它。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我会将您的开关逻辑提取到您的类的实例方法:

class ProgramOptions {
    var startDate: Date = Date()
    private var trackedActivities = [TrackedItem]()
    private var trackedFoods = [TrackedItem]()
    private var trackedDrugs = [TrackedItem]()

    func trackedItems(forSection section: Int) -> [TrackedItem]? {
        switch section {
            case 1:  return self.trackedActivities
            case 2:  return self.trackedFoods
            case 3:  return self.trackedDrugs
            default: return nil
        }
    }

    func add(trackedActivity activity: TrackItem){
        self.trackedActivities.append(activity)
    }
}

然后在你看来你只需要重新加载表。

答案 1 :(得分:0)

一种可能性是创建一个包装类来存储TrackedItem的数组。比方说,例如:

class TrackedItemCollection {
    var items = Array<TrackedItem>()
}

然后在您的实施中:

class ProgramOptions {
    var startDate: Date = Date()
    var trackedActivities = TrackedItemCollection()
    var trackedFoods = TrackedItemCollection()
    var trackedDrugs = TrackedItemCollection()
    ...
}

func trackedCollectionForSection(_ section: Int) -> TrackedItemCollection? {
    switch(section) {
        case 1:     return programOptions.trackedActivities
        case 2:     return programOptions.trackedFoods
        case 3:     return programOptions.trackedDrugs
        default:    return nil
    }
}

如果需要数组,可以使用items中的TrackedItemCollection属性。由于TrackedItemCollection是一个类,因此是一个引用类型,因此您不会复制数组。