0
点赞
收藏
分享

微信扫一扫

Swift 中数组(Array)删除某个元素

菜菜捞捞 2021-09-19 阅读 178
Swift

之前的方法有点 low 而且浪费时间,评论区有一位 swifter 指导了一下,简直清爽无比。感谢 清無 给出的方法。

使用 array 的 removeAll方法

移除如下数组中值为7的元素

 var numbers = [1, 2, 3, 4, 5, 6, 7]
 numbers.removeAll(where: { $0 == 7})


今天删除数组中某个指定元素,比如像 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
    
}
  1. 删除对象 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)

结语

没把方法封装出来,想使用的小伙伴自己封装一下。

举报

相关推荐

0 条评论