Search code examples
iosswiftnsarray

set NSArray instance using reference in Swift


I'm trying to set the values for NSArray using reference in Swift but can't seem to get it working.

var list = self.isFiltered ? self.filteredEventsList : self.eventsList
self.sortTableViewForEventName(&list)

Then:

private func sortTableViewForEventName(inout eventArray: NSArray) {

        let sortedEvents = eventArray.sortedArrayUsingComparator({ (firstEvent, secondEvent) in

            let firstEventName = (firstEvent as! Event).name
            let secondEventName = (secondEvent as! Event).name

            return firstEventName.compare(secondEventName)
        })

        eventArray = sortedEvents
    }

The change in eventArray does not reflect in eventsList or filteredEventsList, whichever may be applicable.


Solution

  • You need to have a really good reason for using inout parameters, and in this case I don't think you have one. You can simply have your function return the sorted array:

    private func sortTableViewForEventName(eventArray: NSArray) -> NSArray {
        let sortedEvents = eventArray.sortedArrayUsingComparator({ (firstEvent, secondEvent) in
    
            let firstEventName = (firstEvent as! Event).name
            let secondEventName = (secondEvent as! Event).name
    
            return firstEventName.compare(secondEventName)
        })
    
        return sortedEvents
    }
    

    then you would say

    var list = self.isFiltered ? self.filteredEventsList : self.eventsList
    list = self.sortTableViewForEventName(list)
    

    But, unless you have a good reason for using NSArray, you can just use a Swift array and gain type awareness/safety and more concise sorting:

    private func sortTableViewForEventName(eventArray: [Event]) -> [Event] {
        let sortedEvents = eventArray.sort {
            $0.name < $1.name
        }
        return sortedEvents
     }