代码之家  ›  专栏  ›  技术社区  ›  Johnny Mast

为nsmutabledictionary分配协议?

  •  0
  • Johnny Mast  · 技术社区  · 15 年前

    我正在应用程序中使用单点主干来处理指控错误。它们将在singleton中进行处理,并在修复错误后在整个应用程序中广播通知。不管怎样,这不是我的问题,而是当我向这样的singleton对象传递一个新的错误时

    [[SingletonErrors sharederrors] addError:ErrorDictionary_here];
    

    我想要一本错误字典 NSMutableDictionary 由给定的 @protocol 在我的代码中,所以每当我将代码提供给团队中的其他人时,他们都会收到关于错误信息的警告,他们可能忘记将其传递到字典中。

    对于初学者来说,这是否可能,因为这是关于向setter添加协议,getter更容易像

    -(NSMutableArray< myprotocol > *)getmyError{
    
    }
    

    我希望有人能帮我。

    我不是在寻找传递对象(读取类实例)而不是字典,而是在我的字典上应用的协议。

    3 回复  |  直到 13 年前
        1
  •  1
  •   Tim    15 年前

    如果我理解你的要求,你应该能够做到这一点而不需要太多麻烦。在您的singleton类singletonerrors中,您应该具有:

    @interface SingletonErrors : NSObject {
        // some definitions ...
    
        // The current array of all errors. This can also be an NSMutableSet if you like
        NSMutableArray *sharedErrors;
    
        // more definitions ...
    }
    
    // some properties ...
    @property(nonatomic,retain) NSMutableDictionary<ErrorProtocol> *sharedErrors;
    // more properties ...
    
    - (void)addError:(NSMutableDictionary<ErrorProtocol> *)newError;
    
    @end

    您应该创建要实现的协议。在这个示例协议中,假设您希望提供一个方法来检查对象是否有效——也就是说,字典包含所有相关信息。

    @protocol ErrorProtocol
    - (BOOL)isValid;
    @end

    然后需要对nsmutabledictionary进行子类化,以便类实现 ErrorProtocol 协议:

    @interface MyMutableDictionary : NSMutableDictionary <ErrorProtocol> {
    
    }
    
    @end
    
    @implementation MyMutableDictionary
    
    - (BOOL)isValid {
     // Do your validity checking here
    
     return YES; // Obviously change this line
    }
    
    @end

    然后,无论何时抛出错误,都可以将mymutabledictionary的新实例传递给singletonerrors,并让它调用 isValid mymutabledictionary上的选择器,因为它确保字典将符合ErrorProtocol并响应 有效的 :

    - (void)addError:(NSMutableDictionary<ErrorProtocol> *)newError {
     if([newError isValid]) {
      // Add the new error to the current array of errors
      [self.sharedErrors addObject:newError];
      // Other code to "broadcast" the error would go here
     } else {
      // Some code to error out of adding the error would go here
     }
    }

    总体而言,此解决方案的作用是:

    • 保存一个单音错误中所有错误的非可变数组
    • 每个错误都是符合错误协议的NSmutableDictionary。
    • 我们为每个错误使用的对象是mymutabledictionary,它是nsmutabledictionary的一个子类。
    • 协议ErrorProtocol定义一个方法是有效的,用于检查是否可以添加错误。
    • singletonerrors对象调用isvalid方法并适当添加错误
        2
  •  2
  •   Tom Dalling    15 年前

    也可以通过这样的类别实现协议:

    @interface NSMutableDictionary_TD(ErrorExtensions) <ErrorProtocol>
    @end
    
    @implementation NSMutableDictionary(ErrorExtensions)
    //implement the ErrorProtocol here
    @end
    
        3
  •  1
  •   visakh7    13 年前

    是的,但是他们对我不好。我的解决方案与蒂姆的合并是

    @implementation NSMutableArray (myAddition)
    
    - (BOOL)isValid {
        // Do your validity checking here
    
        return YES; // Obviously change this line
    }
    @end
    

    这样就节省了大量的代码。我是血液和信仰中的目标C。越少越好:)..不管怎样,谢谢你的回复,因为我相信这个问题不是一个基本的objc问题。它更先进,我认为很多人会找到这个主题,看到修复,你修复是100%正确的,所以谢谢!..。

    我的心很小,存储着我在这里得到的爱的回答。