美文网首页
Swift 中数组(Array)删除某个元素

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

作者: 张科_Zack | 来源:发表于2021-01-14 07:04 被阅读0次

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

    结语

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

    相关文章

      网友评论

          本文标题:Swift 中数组(Array)删除某个元素

          本文链接:https://www.haomeiwen.com/subject/mtrpaktx.html