swift – 是否可以通过引用而不是副本将数组分配给类属性?

swift – 是否可以通过引用而不是副本将数组分配给类属性?,第1张

概述背景: 我设计了一个TableViewDataSource类,它为UITableViewDataSource和UITableViewDelegate提供了一个实现.您实例化TableViewSection对象,这些对象传递给TableViewDataSource,用于配置单元格,节标题,句柄选择,行插入等. TableViewSection对象有一个名为dataSource:[AnyObject] 背景:

我设计了一个tableVIEwDataSource类,它为UItableVIEwDataSource和UItableVIEwDelegate提供了一个实现.您实例化tableVIEwSection对象,这些对象传递给tableVIEwDataSource,用于配置单元格,节标题,句柄选择,行插入等.

tableVIEwSection对象有一个名为dataSource:[AnyObject]?的属性,当设置它时,它用于计算节中的行数,并为单元配置块提供一个对象:

// get the section,dequeue a cell for that section,retrIEve the item from the dataSource// ...tableSection.cellConfigurationBlock?(cell: AnyObject,item: AnyObject?,indexPath: NSIndexPath)return cell

我想做的是从我的viewmodel到我的tableSection.dataSource分配对数组的引用,让我的viewmodel更新数组,然后更新表视图.在Swift中,您无法通过引用传递数组.解决方法似乎是使用NSMutableArray,但随之而来的是类型安全性的损失,以及从Swift到Foundation来回转换对象时的更大认知负担.

工作实例:

let kCellIDentifIEr = "SomeCellIDentifIEr"class MyVIEwController: UItableVIEwController {    // Property declarations    @IBOutlet var tableDataSource: tableVIEwDataSource!    var viewmodel: MyVIEwControllerviewmodel = MyVIEwControllerviewmodel()    overrIDe func vIEwDIDLoad() {        super.vIEwDIDLoad()        self.setuptableVIEw()        self.refresh()    }    func setuptableVIEw() {        var tableSection = tableVIEwSection(cellIDentifIEr: kCellIDentifIEr)        tableSection.dataSource = self.viewmodel.collection        // tableSection configuration        // ...        self.tableDataSource.addSection(tableSection)    }    func refresh() {        self.viewmodel            .refresh()            .subscribeNext({ result in                self.tableVIEw.reloadData()            },error: { error in                self.logger.error(error.localizedDescription)            })    }}

viewmodel上的refresh()方法命中我的API服务,在响应时更新它的集合属性,并在RACSignal的下一个事件上提供结果(RACSignal是由Reactive Cocoa提供的类,除此之外).

我找到了一种解决方法,包括每次进行单次更新时或批量更新后重新分配数据源.

func refresh() {    self.viewmodel        .refresh()        .subscribeNext({ result in            self.updateDataSource()            self.tableVIEw.reloadData()        },error: { error in            self.logger.error(error.localizedDescription)        })}func updateDataSource() {    self.tableDataSource.tableSectionForIndex(0)?.dataSource = viewmodel.collection}

这种方法有效,但只能暂时作为解决方法.随着tableVIEwDataSource的增长和变得越来越复杂,使用命令式过程代码时,这种方法变得越来越复杂,这与我在编写类时要实现的目标相反.

是否有任何解决方法坚持使用本机Swift数组来实现相当于通过引用传递Foundation NSArray或NSMutableArray?

奖金问题

有人能为我提供一些类/结构设计技巧,以实现纯Swift中的预期目标吗?

简单的解决方案是将数组包装在一个类中.类实例通过引用传递,因此问题得到了有效解决:通过对类实例的任何引用对数组的更改会影响数组,如通过对该类实例的每次引用所看到的那样.

有问题的类可以非常轻量级 – 基本上,它只是作为一个包装数组的瘦包装器,客户端通过类实例直接访问数组 – 或者恰恰相反,您可以将类设计为管理数组,即类有意提供类似于数组的API,以保护客户端免受底层实现的影响.这两种方法都可能是合适的;我当然都做到了.

这是第一种情况的例子.我的模型对象是属于UIdocument子类的数组.我的视图控制器是一个UItableVIEwController.用户将在表中查看,添加和编辑模型实体.因此,UItableVIEwController需要访问UIdocument的数组(恰好称为人员).

>在Objective-C中,我的UItableVIEwController只是对数组self.people进行了引用,这是一个NSMutableArray.这只是一个指针,因此对self.people的更改也是UIdocument的人员的变化 – 他们是同一个对象.
>在Swift中,我的UItableVIEwController包含对UIdocument对象self.doc的引用.这个数组现在是一个Swift数组,它位于“内部”,所以我可以将它称为self.doc.people.但是,重写太多了!相反,我创建了一个计算的变量属性self.people,它充当self.doc.people的网关:

var doc : Peopledocument!var people : [Person] { // front end for the document's model object    get {        return self.doc.people    }    set (val) {        self.doc.people = val    }}

嘿presto,问题解决了.每当我说像self.people.append(newPerson)之类的东西时,我都会直接传递给UIdocument的模型对象人员,我实际上是在追加它.因此,代码看起来和工作方式就像在Objective-C中一样,完全不用担心.

总结

以上是内存溢出为你收集整理的swift – 是否可以通过引用而不是副本将数组分配给类属性?全部内容,希望文章能够帮你解决swift – 是否可以通过引用而不是副本将数组分配给类属性?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1037267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存