![](/img/trans.png)
[英]MagicalRecords import data from JSON / NSDictionary. Import relationships
[英]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.