ppp
ppp

Reputation: 771

Issue with removing from array

I'm trying to check whether an object (order of type Order) already exists in an array (newOrderItems - array of Order) before appending it so that I avoid duplicates.

Array declaration:

var newOrderItems = [Order]()

Attempting to delete if exists before appending:

let order = Order(item: item!.name, price: item!.price, quantity: 1, status: "", tags: "", selectedTags: item!.selectedTags, id: item!.id)

if newOrderItems.filter({ $0 == order }).count > 0 {
    newOrderItems.removeAtIndex(newOrderItems.indexOf(order))
}

newOrderItems.append(order!)

The above gives 2 errors:

****** Error 1 ******

Binary operator '==' cannot be applied to operands of type 'Order' and 'Order?'

in line:

if newOrderItems.filter({ $0 == order }).count > 0

****** Error 2 ******

Cannot convert value of type 'Order?' to expected argument type '@noescape (Order) throws -> Bool'

in line:

newOrderItems.removeAtIndex(newOrderItems.indexOf(order))

What am I missing here?


****** EDIT ******

I can get it to work if I rewrite it using a loop:

var counter = 0

for item in newOrderItems {

    if item.id == order?.id {
        newOrderItems.removeAtIndex(counter)
        break
    }
    counter++
}
newOrderItems.append(order!)

Upvotes: 0

Views: 36

Answers (2)

NSAnant
NSAnant

Reputation: 816

Simple solution to your problem. only replace your

if newOrderItems.filter({ $0 == order }).count > 0

with

if newOrderItems.filter({ $0.id == order.id }).count > 0

Thanks ;]

Upvotes: 1

Code Different
Code Different

Reputation: 93151

Compare the comparison code in your filter:

if newOrderItems.filter({ $0 == order }).count > 0 { ... }

With that in the while loop:

if item.id == order?.id { ... }

Swift doesn't know how to compare 2 objects of type Order but it knows how to compare 2 Ints (assuming id is of type Int)


Solution

Define an == function for Order:

func ==(lhs: Order, rhs: Order) -> Bool {
    return lhs.id == rhs.id
}

Then you should be able to use filter

if newOrderItems.filter({ $0 == order }).count > 0 {
    newOrderItems.removeAtIndex(newOrderItems.indexOf(order))
}

However, if you want your OrderID to be unique, a Dictionary may be more appropriate.

Upvotes: 0

Related Questions