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

在使用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>()

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值