NSDictionary细说(八)—— 字典的过滤和存储

版本记录

版本号 时间
V1.0 2017.08.28

前言

NSDictionary是不可变字典,它的不可变性可以参考NSArray数组,但是它与数组还是有很大不同,尽管他们都属于集合类,下面这几篇我们继续来将一下基础类的知识。还是老规矩从整体到局部,从浅入深进行讲解,谢谢大家。感兴趣的可以参考我上面几篇。
1. NSDictionary细说(一)—— 整体了解
2. NSDictionary细说(二)—— 字典的创建
3. NSDictionary细说(三)—— 字典的初始化
4. NSDictionary细说(四)—— 共享键集、数量以及相等比较
5. NSDictionary细说(五)—— 键和值的获取
6. NSDictionary细说(六)—— 字典的遍历
7. NSDictionary细说(七)—— 字典的排序

一、- (NSSet<KeyType> *)keysOfEntriesPassingTest:(BOOL (^)(KeyType key, ObjectType obj, BOOL *stop))predicate;

该方法的作用是:返回一组键,它的对应的值满足block块。

下面看一下返回值:返回一组keykey对应的值满足predicate

下面看一下示例代码

- (void)demoKeysOfEntriesPassingTest
{
    NSDictionary *dict = @{@"One" : @1, @"Two" : @2, @"Three" : @3};
    NSSet *set = [dict keysOfEntriesPassingTest:^BOOL(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        if ([key isEqualToString:@"Two"]) {
            return NO;
        }
        return YES;
    }];
    NSLog(@"set = %@", set);
}

看一下返回值

2017-08-28 15:30:02.171050+0800 JJOC[839:500822] set = {(
    One,
    Three
)}

结论:根据条件进行键的过滤。


二、- (NSSet<KeyType> *)keysOfEntriesWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(KeyType key, ObjectType obj, BOOL *stop))predicate;

该方法的作用就是:和方法一是类似的都是返回一组key键,这个键满足的是block里面的条件。

下面看一下参数和返回值:

  • opts:枚举选项的一个掩码。
  • predicate:指定字典中值的约束的块对象。
  • return:一组键值满足predicate条件。

下面我们就看示例代码

- (void)demoKeysOfEntriesWithOptions
{
    NSDictionary *dict = @{@"One" : @1, @"Two" : @2, @"Three" : @3};
    NSSet *set = [dict keysOfEntriesWithOptions:NSEnumerationReverse passingTest:^BOOL(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        if ([key isEqualToString:@"Two"]) {
            return NO;
        }
        return YES;
    }];
    NSLog(@"set = %@", set);
}

看输出结果

2017-08-28 15:36:31.637780+0800 JJOC[842:501588] set = {(
    One,
    Three
)}

结论:没有枚举选项的过滤器。


三、- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;

该方法的作用是:将字典内容的属性列表表示写入给定的路径。

下面看一下参数和返回值:

  • path:写入文件的路径。如果路径包含波形符(〜)字符,则在调用此方法之前必须使用stringByExpandingTildeInPath进行扩展。
  • useAuxiliaryFile:一个指定文件是否应该被原子地写入的标志。如果标志为YES,则将字典写入辅助文件,然后将辅助文件重命名为路径。 如果标志为NO,则字典直接写入路径。 YES选项保证路径(如果存在)将不会被破坏,即使系统在写入时应该崩溃。
  • return:成功YES失败NO。

还要注意:

  • 此方法递归地验证所有包含的对象是否是在写出文件之前的属性列表对象(NSData,NSDate,NSNumber,NSString,NSArray 或 NSDictionary的实例),如果所有对象不是属性列表对象,则返回否,因为 结果文件不会是有效的属性列表。
  • 如果字典的内容都是属性列表对象,则该方法编写的文件可用于使用类方法dictionaryWithContentsOfFile或实例方法initWithContentsOfFile初始化新字典。
  • 如果您需要更好地控制属性列表表示,请改用NSPropertyListSerialization

下面看示例代码

- (void)demoWriteToFile
{
    NSArray *dict = @[@"6", @"9", @"2", @"1"];
    BOOL result = [dict writeToFile:@"/Users/hrl/Desktop/1.txt" atomically:NO];
    NSLog(@"result = %d", result);
}

下面看输出结果

2017-08-28 16:08:25.280734+0800 JJOC[867:506373] result = 0

结论:将字典写入文件。


四、- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;

该方法的作用就是:将字典内容的属性列表表示写入给定的URL。

下面看一下参数和返回值:

  • url:字典写入的地址。
  • atomically:如果标志为YES,则将字典写入辅助位置,然后将辅助位置重命名为aURL。 如果标志为NO,则将字典直接写入aURL。 YES选项确保aURL(如果存在)将不会损坏,即使系统在写入过程中崩溃。 如果aURL是不能被原子写入的类型,标志将被忽略。
  • return:成功YES失败NO。

还要注意:

  • 此方法递归地验证所有包含的对象是否是在写出文件之前的属性列表对象(NSData,NSDate,NSNumber,NSString,NSArray或NSDictionary的实例),如果所有对象不是属性列表对象,则返回否,因为 结果输出不会是有效的属性列表。
  • 如果字典的内容都是属性列表对象,则该方法写入的位置可用于使用类方法dictionaryWithContentsOfURL或实例方法initWithContentsOfURL初始化新字典。
  • 如果您需要更好地控制属性列表表示,请改用NSPropertyListSerialization

结论:将字典写入URL。

后记

未完,待续~~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容