我对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中实际数组的引用,然后我可以添加和删除项目?
当然,我可以在每个使用它的地方都有一个开关声明,但是它们中有很多,我想避免这种情况。我假设有一个简单的答案,我现在太无知了解它。感谢您的帮助!
答案 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
是一个类,因此是一个引用类型,因此您不会复制数组。