[英]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. 我正在尝试使用Swift中的引用来设置NSArray的值,但似乎无法使其正常工作。
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. eventArray中的更改不会反映在eventsList或filteredEventsList中,以适用者为准。
It would be much easier in this case to use a Swift array [Event]
you can then sort and filter something like this... 在这种情况下,使用Swift数组
[Event]
会容易得多,然后您可以对此类内容进行排序和过滤...
private func sortedEventsByName(events: [Event]) -> [Event] {
return events.sort {
$0.name > $1.name
}
}
What would be even simpler is to create an extension on Event
like so... 更简单的是像这样创建
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
}
Then you can just use sort like this... 然后,您可以使用像这样的排序...
let sortedEvents = events.sort(<)
and 和
let filteredEvents = events.filter {
$0.name == someFilterName
}
You need to have a really good reason for using inout
parameters, and in this case I don't think you have one. 您需要有一个使用
inout
参数的确实很好的理由,在这种情况下,我认为您没有一个。 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: 但是,除非您有充分的理由使用
NSArray
,否则只能使用Swift数组并获得类型识别/安全性和更简洁的排序:
private func sortTableViewForEventName(eventArray: [Event]) -> [Event] {
let sortedEvents = eventArray.sort {
$0.name < $1.name
}
return sortedEvents
}
What you give to sortTableViewForEventName
is a reference to list
, and NSArray
is immutable, so the only thing you modify is the local variable list
. 您给
sortTableViewForEventName
是对list
的引用,并且NSArray
是不可变的,因此您唯一需要修改的就是局部变量list
。
you might try this : 您可以尝试这样:
var list = self.isFiltered ? self.filteredEventsList : self.eventsList
self.sortTableViewForEventName(&list)
if self.isFiltered {
self.filteredEventsList = list
} else {
self.eventsList = list
}
or this (not sure if it works) : 或这个(不确定是否可行):
self.sortTableViewForEventName(self.isFiltered ? &self.filteredEventsList : &self.eventsList)
or make filteredEventsList and eventsList NSMutableArray, but it's probably not a good idea, because it would break encapsulation. 或使filteredEventsList和eventsList为NSMutableArray,但这可能不是一个好主意,因为它会破坏封装。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.