使用Swift中的引用设置NSArray实例

时间:2016-07-11 13:10:59

标签: ios swift nsarray

我试图在Swift中使用引用设置NSArray的值,但似乎无法使其正常工作。

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

然后:

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
    }

eventArray中的更改不会反映在eventsList或filteredEventsList中,以适用者为准。

3 个答案:

答案 0 :(得分:2)

在这种情况下,使用Swift数组[Event]会更容易,然后你可以对这样的东西进行排序和过滤......

private func sortedEventsByName(events: [Event]) -> [Event] {
    return events.sort {
        $0.name > $1.name
    }
}

更简单的是在Event上创建一个扩展名,就像这样......

extension Event: Comparable {}

func == (lhs: Event, rhs: Event) -> Bool {
    return lsh.name == rhs.name
}

func < (lhs: Event, rhs: Event) -> Bool {
    return lhs.name < rhs.name
}

然后你可以使用这样的排序......

let sortedEvents = events.sort(<)

let filteredEvents = events.filter {
    $0.name == someFilterName
}

答案 1 :(得分:1)

你需要有一个非常好的理由来使用inout参数,在这种情况下我认为你没有参数。您只需让函数返回已排序的数组:

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
}

然后你会说

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

但是,除非你有充分的理由使用NSArray,否则你可以使用Swift数组并获得类型感知/安全性和更简洁的排序:

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

答案 2 :(得分:0)

您向sortTableViewForEventName提供的内容是对list的引用,NSArray是不可变的,因此您修改的唯一内容是本地变量list

你可以试试这个:

var list = self.isFiltered ? self.filteredEventsList : self.eventsList
self.sortTableViewForEventName(&list)
if self.isFiltered {
  self.filteredEventsList = list
} else {
  self.eventsList = list
}

或者这个(不确定它是否有效):

self.sortTableViewForEventName(self.isFiltered ? &self.filteredEventsList : &self.eventsList)

或make filteredEventsList和eventsList NSMutableArray,但它可能不是一个好主意,因为它会破坏封装。