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>()
这一次问题的主要原因在于我对类型严格和类型检查的不了解和不熟悉,查找问题源头的时候也有验证过自己的类是否遵循了协议,但是却忽视了数组的声明,所以才会冒出明明所有对象都遵循协议却偏偏不能正常识别和调用的问题。
为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>()
这一次问题的主要原因在于我对类型严格和类型检查的不了解和不熟悉,查找问题源头的时候也有验证过自己的类是否遵循了协议,但是却忽视了数组的声明,所以才会冒出明明所有对象都遵循协议却偏偏不能正常识别和调用的问题。
相关文章推荐
- 在做动态添加删除行的时候,使用jquery遇到的问题:$("#participantList tr").eq(i).remove();
- swift调用object-c项目遇到的问题与解决方法
- js:在对象的某方法中添加监听时遇到的问题
- ArrayList在执行remove方法时遇到的问题
- NSMutableArray调用removeObject方法删除NSDictionary对象时遇到的问题
- 为javascript的Array添加个has(value),remove(value),removeAt(index)方法
- 在wireshark里添加新的dissector遇到的问题及解决方法
- iOS swift 关于NavigationController遇到的一些问题及解决方法
- Swift - 给按钮添加private的方法后,点击出错的问题
- 在wireshark里添加新的dissector遇到的问题及解决方法
- Exchange 2013 为DAG添加成员服务器,遇到的几个问题解决方法 推荐
- myeclise添加javascript插件aptana方法及遇到问题的解决
- 在sps中遇到“不能添加用户,用户名已经存在”的问题的解决方法
- [Javascript]给Javascript中的Array添加Remove方法
- 项目中遇到的问题与解决方法——持续添加
- Swift 3中使用FMDB遇到的问题与解决方法
- 安卓添加事件遇到的一个问题以及他的解决方法
- 记一次处理 list 的 remove 方法遇到的问题
- mingw编译SDL_gfx库时遇到undefined reference to 'GFX_ALPHA_ADJUST_ARRAY'问题的解决方法
- 今天遇到的对List,ArrayList的remove方法的一个小问题