概述
对于swift语言的便捷性,相信用过的小伙伴深有体会。不过也会有一些麻烦的地方。比如对于数组Array没有removeObject的方法,这就对于一些数据的处理比较麻烦。
对于 Swift中删除处理 一般需要这种方式
if let index = index(of: object) {
remove(at: index)
}
先找到index,然后再进行
taskArray.remove(at: <#T##Int#>)
进行删除操作
而且这种操作必须满足
- var taskArray = BCTask 数组的声明要确定元素的对象类型
- BCTask,数组中元素的类型要继承NSObject
我在项目中的处理是
为Array类添加扩展
extension Array where Element: Equatable {
mutating func remove(_ object: Element) {
if let index = index(of: object) {
remove(at: index)
}
}}
为数组中的元素进行处理
class BCTask: NSObject, HandyJSON {
var code: String?
var address: String?
var type: String?
var progress: String? //1是新的 2 表示进行中
var no: Int?
var describe: String?
var selectState = false
required override init() {
}
}
然后进行数据的处理使用
//批量删除
func batchClick() {
for model in UserTasks.share.tasks {
if model.selectState{
UserTasks.share.tasks.remove(model)
}
}
taskArray = UserTasks.share.tasks
tasksTab.reloadData()
}
补充一点
-
在我使用 struct 或者 没有继承NSObject的class得对象类型作为元素的时候
在我尝试使用index(of: object)方法的时候会提示:
Cannot invoke 'index' with an argument list of type '(of: AnyObject)' -
还有
var taskArray = Array<Any>()
的方式,但是Any并不是一个遵守Equatable协议的表示,即便我存入数组里的都是继承自NSObject的对象,而NSObject原生遵守Equatable协议,但是在类型严格的语言情况下这会被否定。而事实上我存在里面的全都是Line类型实例,一个继承自遵守Equatable协议的NSObject的类。
在把声明换成以下写法之后一切终于正常进行。
var taskArray = Array< BCTask >() 或者
var taskArray = [BCTask](
注意查找问题源头的时候也要验证过自己的类是否遵循了协议,不能忽视了数组的声明,不然会冒出明明所有对象都遵循协议却偏偏不能正常识别和调用的问题。
网友评论