【问题标题】:Collection element of type 'CGSize' is not an Objective-C object'CGSize' 类型的集合元素不是 Objective-C 对象
【发布时间】:2013-03-18 21:39:40
【问题描述】:

我正在尝试给一个 NSDictionary 键值一个 CGSize,而 XCode 给了我这个错误。我的代码:

       NSArray *rows = @[
        @{@"size" : (CGSize){self.view.bounds.size.width, 100}
          }
        ];

为什么我在这里收到错误消息?如果不可能将 CGSize 存储在 dict 中,那么还有什么替代方法?

编辑: 现在得到“使用类型'CGSize'(又名'struct CGSize'),其中需要算术、指针或向量类型”错误代码:

NSDictionary *row = rows[@0];
CGSize rowSize = [row[@"size"] CGSizeValue] ? : (CGSize){self.view.bounds.size.width, 80};

【问题讨论】:

    标签: objective-c core-graphics nsdictionary cgsize


    【解决方案1】:

    CGSize 不是对象。这是一个C结构。如果您需要将其存储在 obj-c 集合中,标准方法是将其包装在 NSValue 中,如下所示:

    NSArray *rows = @[
     @{@"size" : [NSValue valueWithCGSize:(CGSize){self.view.bounds.size.width, 100}]
      }
    ];
    

    然后当您需要返回 CGSize 时,您只需调用 -CGSizeValue 方法,例如

    CGSize size = [rows[0][@"size"] CGSizeValue];
    

    【讨论】:

    • 很遗憾,您不能使用新的文字语法将任意 C 结构放入 Objective-c 对象中。我会看到的唯一真正困难是处理选择器以将其取出。
    • 分配一个块作为返回 CGSize 的值怎么样?有点像 Python 中的“Lambda”
    • @yourfriendzak:这似乎有点荒谬。
    • @KevinBallard 为什么?内联匿名函数(在 obj-c 中也称为“块”)听起来像是一个完全有效的值。
    • @yourfriendzak:这意味着你可以说foo ?: bar,它相当于foo ? foo : bar(同时只评估一次foo)。但这在这里不起作用,因为您想测试值row[@"size"],然后在non-nil 时对其调用一个方法,或者在nil 时返回另一个值。
    【解决方案2】:

    Kevin 的回答仅适用于 iOS;对于 Mac OS X (Cocoa) 执行:

    [NSValue valueWithSize:NSMakeSize(self.view.bounds.size.width, 100)];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多