Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

วิธีลบ Element เฉพาะจาก Array ใน Swift

ลบ Element เฉพาะจาก Array Swift หลายวิธี ขึ้นอยู่กับความต้องการ

วิธีที่ 1: filter (สร้าง Array ใหม่ - Functional)


var array = ["a", "b", "c", "f"]
let filtered = array.filter { $0 != "f" }
print(filtered) // ["a", "b", "c"]
// Original array ไม่เปลี่ยน

วิธีที่ 2: remove(at:) - Mutate Array เดิม


var array = ["a", "b", "c", "f"]
if let index = array.firstIndex(of: "c") {
    array.remove(at: index)
}
print(array) // ["a", "b", "f"]

วิธีที่ 3: removeAll(where:) - ลบหลายตัว (Swift 4.2+)


var array = [1, 2, 3, 4, 5, 6, 2, 3]
array.removeAll { $0 % 2 == 0 } // ลบเลขคู่
print(array) // [1, 3, 5, 3]

วิธีที่ 4: ลบหลาย Index พร้อมกัน (เรียงจากท้าย)


var array = ["a", "b", "c", "d", "e"]
let indicesToRemove = [1, 3] // Remove "b" และ "d"

for index in indicesToRemove.sorted(by: >) {
    array.remove(at: index)
}
print(array) // ["a", "c", "e"]

Extension Helper


extension Array where Element: Equatable {
    mutating func removeFirst(_ element: Element) {
        if let index = firstIndex(of: element) { remove(at: index) }
    }
    
    mutating func removeAll(_ elements: [Element]) {
        for element in elements { removeFirst(element) }
    }
    
    func removing(_ element: Element) -> [Element] {
        return filter { $0 != element }
    }
    
    func removing(_ elements: [Element]) -> [Element] {
        let set = Set(elements)
        return filter { !set.contains($0) }
    }
}

// ใช้งาน
var arr = [1,2,3,4,5]
arr.removeFirst(3)        // [1,2,4,5]
arr.removeAll([1,5])      // [2,4]
let newArr = arr.removing(2) // [4] (Original ไม่เปลี่ยน)

Performance Comparison

MethodTimeSpaceMutates
filterO(n)O(n)No
remove(at:)O(n)O(1)Yes
removeAll(where:)O(n)O(1)Yes
Multiple remove(at:)O(k×n)O(1)Yes

สำหรับ Object/Struct (ไม่ใช่ Equatable)


struct User { let id: Int; let name: String }

var users = [User(id: 1, name: "A"), User(id: 2, name: "B"), User(id: 3, name: "C")]

// Filter by Property
users = users.filter { $0.id != 2 }

// Remove by Index
if let index = users.firstIndex(where: { $0.id == 2 }) {
    users.remove(at: index)
}