如果这看起来像一个愚蠢的问题,我很抱歉。我wana只是隐藏了字典中的一个对象,以便在NSlogged时不会打印隐藏的键/值对,但它仍然存在于字典中,然后在需要时再使用它。对象可以隐藏在NSDictionary中。不从字典中删除只是隐藏
可能吗?
如果这看起来像一个愚蠢的问题,我很抱歉。我wana只是隐藏了字典中的一个对象,以便在NSlogged时不会打印隐藏的键/值对,但它仍然存在于字典中,然后在需要时再使用它。对象可以隐藏在NSDictionary中。不从字典中删除只是隐藏
可能吗?
不,它不是。如果你想要一个私人词典,然后创建一个新的词典,而不是在原始词典中包含键/值对。
我设法禁用一些使用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
中。
给你辞典的例子
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指定您的过滤器选项并更换如果与我们的条件比较,以显示或隐藏对象。
您可以创建自己的'NSDictionary'子类并覆盖'description' – Paulw11