Swift 为Array添加remove方法遇到的问题

来源:互联网 发布:淘宝墙上挂的饰品 编辑:程序博客网 时间:2024/05/18 03:16

在使用Swift的Array的时候发现没有removeObject方法,出于使用原生类型的考虑不打算换成NSMutableArray,于是在网上找到解决方式如下:

为Array类添加扩展

extension Array where Element: Equatable {        // Remove first collection element that is equal to the given `object`:    mutating func remove(_ object: Element) {        if let index = index(of: object) {            remove(at: index)        }    }}

代码摘自:http://stackoverflow.com/questions/24938948/array-extension-to-remove-object-by-value


如此则可如

var a = [1,2,2,3]a.remove(2)
一般流畅使用。

在Playground中测试以上例子确实无比顺利,但是具体项目编写的时候一直提示问题,

提示为:incorrect argument label in call (have 'object:', expected 'at:')


而且在我尝试使用index(of: object)方法的时候会提示:

Cannot invoke 'index' with an argument list of type '(of: AnyObject)'


经过反复研究,发现这是我的疏忽。

由于对于Swift的类型严格的不熟悉,我在声明Array的时候使用了

var finishedLines = Array<Any>()
的方式,但是Any并不是一个遵守Equatable协议的表示,即便我存入数组里的都是继承自NSObject的对象,而NSObject原生遵守Equatable协议,但是在类型严格的语言情况下这会被否定。而事实上我存在里面的全都是Line类型实例,一个继承自遵守Equatable协议的NSObject的类。

在把声明换成以下写法之后一切终于正常进行。

var finishedLines = Array<Line>()

这一次问题的主要原因在于我对类型严格和类型检查的不了解和不熟悉,查找问题源头的时候也有验证过自己的类是否遵循了协议,但是却忽视了数组的声明,所以才会冒出明明所有对象都遵循协议却偏偏不能正常识别和调用的问题。



0 0
原创粉丝点击