2016-07-05 59 views

回答

1

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

0

我設法禁用一些使用Method swizzling打印的鍵。解決辦法是在斯威夫特,但它應該是在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中。

0

給你辭典的例子

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指定您的過濾器選項並更換如果與我們的條件比較,以顯示或隱藏對象。