使用 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
}
我正在尝试使用 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
}