【问题标题】:Initializing NSDictionary初始化 NSDictionary
【发布时间】:2012-02-08 14:48:07
【问题描述】:

以下是我的 .h 文件:

    NSDictionary *originalValues;
    @property (nonatomic, retain) NSDictionary *originalValues;

这是用于初始化 NSDictionary 的 .m 文件。

@synthesize originalValues;

- (void)viewDidLoad {

// copy original values when view loaded
originalValues = [[NSDictionary alloc] initWithObjectsAndKeys:place.city, @"city", place.cuisine, @"cuisine",
                place.latitude, @"latitude", place.longitude, @"longitude", place.name, @"name", place.rating,
                @"rating", place.state, @"state", place.street, @"street", place.telephone, @"telephone",
                place.timesVisited, @"times visited", place.uppercaseFirstLetterOfName, @"first letter", 
                place.website, @"website", place.zipcode, @"zipcode", nil];
}

问题是只添加了前四个对象和键。之后,它们不会被添加到以 place.name、@"name" 开头的字典中。我在整个字典上做了一个 NSLog,唯一输出的是我提到的前四个值,所以我在 place.name 上做了一个 NSLog,它正在输出一个值,所以我知道也应该为这个键/值输出一些东西一对。我在这里缺少什么吗?我很好奇为什么最初没有将所有值都添加到 NSDictionary 中?

【问题讨论】:

    标签: objective-c ios xcode nsdictionary


    【解决方案1】:

    如果其中一个对象是nil,那么如果您使用新的文字语法来初始化NSDictionary(如下),则可以更快地捕获。这种语法不仅更短,而且更健壮:如果您的对象之一是nil,您实际上会收到运行时错误,而不是默默地继续执行不完整的数据。

    originalValues = @{ @"city"     : place.city, 
                        @"latitude" : place.latitude,
                        // etc.
                      };
    

    【讨论】:

    • 虽然文字语法更好也更受欢迎,但我不确定当一个值为 nil 时 OP 是否正在寻找运行时错误。
    【解决方案2】:

    它们没有被添加的原因是因为一个对象是 nil ,它标志着字典的结束。您需要确保每个对象都不是nil,如果是,您可以使用[NSNull null] 代替它。还可以使用self.originalValues = ... 进行正确的内存管理。只需确保使用字典的内容检查/可以处理 NSNull 值。

    使用gnu ternary extension的示例:

    self.originalValues = [[NSDictionary alloc] initWithObjectsAndKeys:
                             place.city ?: [NSNull null], @"city",
                             place.cuisine ?: [NSNull null], @"cuisine",
                             place.latitude ?: [NSNull null], @"latitude",
                             place.longitude ?: [NSNull null], @"longitude",
                             place.name ?: [NSNull null], @"name",
                             place.rating ?: [NSNull null], @"rating",
                             place.state ?: [NSNull null], @"state",
                             place.street ?: [NSNull null], @"street",
                             place.telephone ?: [NSNull null], @"telephone",
                             place.timesVisited ?: [NSNull null], @"times visited",
                             place.uppercaseFirstLetterOfName ?: [NSNull null], @"first letter", 
                             place.website ?: [NSNull null], @"website",
                             place.zipcode ?: [NSNull null], @"zipcode",
                             nil];
    

    【讨论】:

    • @TReddy 我在所有 C 和 C++ 编码中都避免使用三元表达式。但由于这是 Objective-c,它通常只使用 gcc 或 Apple 的 llvm 编译,我发现使用它没有问题。
    【解决方案3】:

    为了避免在任何字典中出现意外的 nil,最好的解决方案是使用文字和三元运算符(如

    )结合这两种技术
    self.originalValues = @{ @"city" : (place.city ?: @"city"), 
                          @"latitude" : (place.latitude  ?: [NSNull null]),
                          // etc.
                           };
    

    注意:

    (anyValueOrVariable ?:@"anyOtherValueOrVariable")

    是缩写,意思与

    相同

    (anyValueOrVariable != 0) ?任何值或变量: @"anyOtherValueOrVariable"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      相关资源
      最近更新 更多