今天删除数组中某个指定元素,比如像 OC 中一样 remove(object: Object), 但是发现没有方法...。以前也遇到过这样的情况然后当时没记录,今天特此记录。 其实算是一种取巧的办法使用数组的 filter 方法,但是期间又遇到一个问题 swift 中貌似不能直接比较两对象的相等(如果该对象所在的类不是继承 NSObject),因此又使用 runtime 给类扩写了一个计算属性。
删除一个 Swift 对象(不继承 NSObject)
扩展 WebSocket 类(Vapor 中用来使用 socket 的一个类)
扩写 WebSocket 类增加一个计算属性 identifier。
extension WebSocket {
private struct AssociatedKey {
static var identifier: String = "identifier"
}
public var identifier: String {
get {
return objc_getAssociatedObject(self, &AssociatedKey.identifier) as? String ?? ""
}
set {
objc_setAssociatedObject(self, &AssociatedKey.identifier, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
}
}
}
使用 Array 的 filter 方法过滤掉标识相同的对象
如下 sockets 变量 调用 filter ()方法,在其传递的闭包中如果 identifier 属性不相等则过滤掉。
var sockets = [WebSocket]()
sockets = sockets.filter { (webSocket) in
webSocket.identifier != ws.identifier
}
删除一个 NSObject 对象
如果删除一个 NSObject 对象则非常之简单,只需调用 filter ()方法在闭包中直接比较对象不相等则直接过滤掉。
1.申明一个 TestClass 类
class TestClass: NSObject {
var index = 0
}
- 删除对象 object2 用过滤方法
let object1 = TestClass()
object1.index = 1
let object2 = TestClass()
object2.index = 2
let object3 = TestClass()
object3.index = 3
var array = [object1, object2, object3]
print("Before!")
print(array)
array = array.filter({ (test) -> Bool in
!test.isEqual(object2)
})
print("After!")
print(array)
结语
没把方法封装出来,想使用的小伙伴自己封装一下。
网友评论