您的位置:首页 > 移动开发 > Swift

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

2017-04-17 17:43 316 查看
在使用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>()

这一次问题的主要原因在于我对类型严格和类型检查的不了解和不熟悉,查找问题源头的时候也有验证过自己的类是否遵循了协议,但是却忽视了数组的声明,所以才会冒出明明所有对象都遵循协议却偏偏不能正常识别和调用的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swift 扩展