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

set NSArray instance using reference in Swift

我正在尝试使用 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 中,以适用者为准。

你给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)

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

在这种情况下,使用 Swift 数组会容易得多 [Event] 然后您可以像这样排序和过滤...

private func sortedEventsByName(events: [Event]) -> [Event] {
    return events.sort {
        [=10=].name > .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 {
    [=13=].name == someFilterName
}

您需要有充分的理由使用 inout 参数,在这种情况下,我认为您没有理由。你可以简单地让你的函数 return 排序数组:

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 数组并获得类型 awareness/safety 和更简洁的排序:

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