我试图在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中,以适用者为准。
答案 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,但它可能不是一个好主意,因为它会破坏封装。