简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM