如果這看起來像一個愚蠢的問題,我很抱歉。我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