正确的方法返回排序的字典值

时间:2015-04-28 18:40:55

标签: objective-c swift sorting dictionary

我有一个Site类,其中包含Valve个对象的字典。 E.g。

class Site {
    var valves:[String:Valve] = [:]
    ...
}

我的Valve类有一个名为uiCompare()的自定义排序函数。我想向Site添加一个函数,将函数作为排序数组返回。在编译器唠叨之后......我想出了

class Site {
    ...

    func sortedValves() -> [Valve] {
        return self.valves.allValues().sorted { $0.uiCompare($1) }
    }
}

但是这给了我以下错误:

[String:Valve] does not have a member named 'allValues'

所以我很困惑。那不是NSDictionary吗?我正在从以下objc代码中移植此代码:

- (NSMutableArray*) sortedValves {
    NSMutableArray *sorted = [NSMutableArray arrayWithArray: self.valves.allValues];
    [sorted sortUsingSelector: @selector(uiCompare:)];
    return sorted;
}

3 个答案:

答案 0 :(得分:2)

斯威夫特的Dictionary和可可的NSDictionary是可以桥接的,但不是一回事。将Dictionary转换为NSDictionary会产生性能成本。此外,虽然任何NSDictionary都可以转换为Dictionary,但并非所有Dictionary个对象都可以转换为NSDictionary个对象。可以理解的是,他们的界面有些不同。

我经常对sort / sorted方法,map方法或filter方法感到困惑。现在我只是使用免费功能,为了保持一致性,这些功能似乎全面工作。

sorted(valves.values) { $0.uiCompare($1) }

这将返回一个数组。

答案 1 :(得分:1)

如果您想获得所有字典值的无序可迭代集合,请使用Dictionary

方法的values

使用values属性

初始化一个新数组

尝试return Array(valves.values).sorted { $0.uiCompare($1) }

for swift

答案 2 :(得分:1)

 var valves:[String:Valve] = [:]
  

所以我很困惑。那还不是NSDictionary吗?我

没有。这是一个Swift词典,它与NSDictionary本质上是不同的。 要保持NSDictionary功能/方法的使用

var valves = NSDictionary() //or initialised with keys and values or optional or NSMutableDictionary or whatever you need

或将Dictionary转换为NSDictionary