簡體   English   中英

是否可以在NSDictionary中隱藏對象。 不從字典中刪除只是隱藏

[英]Can a object be hidden in NSDictionary. Not removing from dictionary just hidden

很抱歉,這似乎是一個愚蠢的問題。 我只是想從字典中隱藏一個對象,這樣當NSlogged時,隱藏的鍵/值對不會被打印出來,但是仍然存在於字典中,然后在需要時使用它。

可能嗎?

不,不是。 如果您想要一本私人詞典,請創建一個新的詞典,而不要在原始詞典中包含鍵/值對。

我設法禁用了一些使用方法切換打印的鍵。 解決方案在Swift中,但是在Objective-C中應該類似:

extension NSDictionary {

var hiddenKeys : [AnyObject]!{

    get{
        return objc_getAssociatedObject(self, &DictionaryAssociationKey) as? [AnyObject]
    }

    set(newValue){
        objc_setAssociatedObject(self, &DictionaryAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
    }
}


override public class func initialize() {
    struct Static {
        static var token: dispatch_once_t = 0
    }


    dispatch_once(&Static.token) {
        let originalSelector = #selector(NSDictionary.description)
        let swizzledSelector = #selector(NSDictionary.modifiedDescription)

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        _ = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        method_exchangeImplementations(originalMethod, swizzledMethod)

    }
}

func modifiedDescription() -> String{
    if let keys = self.hiddenKeys{
        let newDictionary = NSMutableDictionary(dictionary: self)
        newDictionary.removeObjectsForKeys(keys)

        return newDictionary.description
    }

    return modifiedDescription()
}
}

用法:

let dictionary = NSDictionary(objects: ["Hossam", "12345"], forKeys: ["name", "password"])
    dictionary.hiddenKeys = ["password"]
    print(dictionary) // { name = Hossam; }

想法是我創建NSDictionary的擴展,因此您無需繼承和更改整個應用程序。 然后添加了一個名為hiddenKeys的屬性,您可以在其中添加要隱藏的鍵,這些鍵將不會在description

給你一個字典的例子

  NSDictionary *prices = @{
                             @"Mercedes-Benz SLK250" : [NSDecimalNumber decimalNumberWithString:@"42900.00"],
                             @"Mercedes-Benz E350" : [NSDecimalNumber decimalNumberWithString:@"51000.00"],
                             @"BMW M3 Coupe" : [NSDecimalNumber decimalNumberWithString:@"62000.00"],
                             @"BMW X6" : [NSDecimalNumber decimalNumberWithString:@"55015.00"]
                             };

僅列出價格低於55000的鑰匙

NSDecimalNumber *maximumPrice = [NSDecimalNumber decimalNumberWithString:@"55000.00"];
    NSSet *under55k = [prices keysOfEntriesPassingTest:
                       ^BOOL(id key, id obj, BOOL *stop) {
                           if ([obj compare:maximumPrice] == NSOrderedAscending) {//Use your if condition to show hide object
                               return YES;
                           } else {
                               return NO;
                           }
                       }];
    NSLog(@"%@", under55k);

回答:

{(
    "Mercedes-Benz E350",
    "Mercedes-Benz SLK250"
)}

您可以使用keysOfEntriesPassingTest來指定您的過濾器選項,並將if的比較條件替換為顯示或隱藏對象的條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM