2017-04-16 115 views
1

我有一个NSDictionary,它有一个像messageID5这样的密钥,并且该值有三个键/值对。Swift NSDictionary在不知道密钥名称的情况下获得第0个值

我知道NSDictionary只有1个值,因为我将我的查询限制为1个。但是我不知道密钥的名称。我只想要这个值,但是我不能像数组[0]那样访问它。你可以在PHP或Python中很好地访问它。对于这个基本问题,我一直在尝试很多不同的解决方案,但其中很多看起来过于混乱。 anyValue [0]给我一个类型错误。

+4

只得到它的钥匙第一个属性。如果你的字典是NSDictionary'dict.allKeys.first' –

+0

我认为可能有Keys和Items属性,它返回简单的列表。 –

+0

@LeoDabus谢谢,我仍然收到错误。我应该提到,值本身是另一个NSDictionary,我得到一个类型错误,试图将一个__NSCFString转换为NSDictionary –

回答

3

如果你不知道你的字典键,你可以得到你的NSDictionary allKeys.first财产或allValues.first:

let dict = NSDictionary(dictionary: ["a":["b":1]]) 

let subDict = dict[dict.allKeys.first] as? [String:Any] ?? [:]  // ["b": 1] 
// or 
let subDict = dict.allValues.first as? [String:Any] ?? [:]   // ["b": 1] 
+0

我敢肯定它只是'.keys'在Swift 3中,并且'allKeys'不再支持..你可以使用'dict [dict.keys.first] '或'dict.values.first'。 'dict.values.first'似乎更简单。 –

+0

@DuncanC他正在使用NSDictionary而不是Swift Dictionary。顺便说一句,我正在使用Xcode 8.3.1 Swift 3.1 –

2

确认的第一件事是在字典中的键/值对不保持任何特定的顺序 - 这是优化访问此结构的内容所必需的。

至于你的情况,如果你100%确定你的字典里只有一个值,你可以使用.allValues.first来检索包含的值。如果你知道你的价值的类型是NSDictionary整个代码看起来是这样的:

let childDictionary = rootDictionary.allValues.first as? NSDictionary 
+0

感谢兄弟,但这并没有真正增加利奥说。 –

0

我建议使用(dictionary as Dictionary).values.first。这将返回一个可选项,因为如果字典为空,它可能会失败。

(请注意,我编辑这个答案投字典从NSDictionaryDictionary所以你的使用values财产。NSDictionary没有价值的财产,但不Dictionary

+1

你应该再次读这个问题 –

+0

NSDictionary没有值属性 –

+0

你是对的,我错过了这是一个NSDictionary的事实。你不能转换成Dictionary并使用values属性吗? –

相关问题