【问题标题】:Retrieving and removing an object from an NSMutableDictionary in one go一次性从 NSMutableDictionary 中检索和删除对象
【发布时间】:2016-08-12 10:38:37
【问题描述】:

有没有办法一次性从 NSMutableDictionary 中检索和删除对象?一种会折叠以下内容的方法:

id myObject = [myMutableDict objectForKey:@"myKey"]

if(myObject)
{
    [myMutableDict removeObjectForKey:@"myKey"];

    ...my code...
}

到:

id myObject = [myMutableDict retrieveAndRemoveObjectForKey:@"myKey"];

if (myObject)
{
    ...my code...
}

我没有遇到任何瓶颈或任何问题,也没有分析任何内容,但是有一种方法可以从可变字典中删除对象并一次性返回它,这样字典才有意义最终不会找到“myObject”两次(我知道我不应该对 NSMutableDictionary 内部的工作方式做出任何假设)。

【问题讨论】:

  • “有意义”?不,它没有。我还没有在任何其他语言运行时的任何集合类中看到这样的方法。但是,如果您想自己写一个,那么创建一个类别是继续的方法。
  • “我还没有在任何其他语言运行时的任何集合类中看到这样的方法。”这几乎不是它是否有意义的论据。在其他语言中,您可以找到一个元素,获取一个迭代器,然后在恒定时间内使用迭代器删除对象。在这里,NSMutableDictionary 可能必须在内部查找“myObject”两次,每次调用一次,所以一个同时执行这两个操作的方法非常有意义。无论如何,如果没有内置任何东西,那么我想答案是否定的。
  • Python中至少有这样的方法:docs.python.org/3/library/stdtypes.html#dict.pop
  • @Droppy 那么 pop 呢?在堆栈中弹出(检索和删除)最后一个元素是很常见的......为什么不在字典中?我有点明白需要。 :)
  • 是的,有一个。但这肯定不常见,而且对它的需求不仅仅是“有意义”,尤其是考虑到字典无论如何都倾向于快速查找。

标签: ios objective-c nsmutabledictionary


【解决方案1】:

您可以给NSMutableDictionary添加一个类别并添加功能:

-(id) retrieveAndRemoveObjectForKey:(NSString*)key {
     id myObject = [self objectForKey:@"myKey"];

     if(myObject)
     {
         [self removeObjectForKey:@"myKey"];
     }

     return myObject;
}

如果你有错误的访问权限意味着你需要保留myObject

【讨论】:

  • 这不是一个类别,因为它引用了一个名为 myMutableDict 的变量。
【解决方案2】:

按照建议,在 NSMutablArray 上写一个类别:

NSMutableArray+Pop.h

@interface NSMutableArray (pop)

-(id) popObjectForKey:(NSString*)key;

@end

NSMutableArray+Pop.m

@implementation NSMutableArray (pop)

-(id) popObjectForKey:(NSString*)key {
    id result = self[key];
    self[key] = nil;
    return result;
}

@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多