gpt4 book ai didi

ios - 使用 KVC 在 NSArray 中获取 NSValue 转换的 CGPoints 的最小/最大坐标

转载 作者:可可西里 更新时间:2023-11-01 04:22:37 25 4
gpt4 key购买 nike

我最近阅读了一些关于 Key-Value Coding 的文档和一些博客条目,发现它非常有用。我想将它用于我的案例,但到目前为止我还没有成功。

在我的例子中,我有一个 NSMutableArray 包含转换为 NSValueCGPoint。我将向这个数据数组添加很多点,我想获得最小/最大 x 和 y 值。例如:

NSMutableArray *data = [[NSMutableArray alloc] init];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(20.0f, 10.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(5.0f, -15.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(-5.0f, 20.0f)]];
[data addObject:[NSValue valueWithCGPoint:CGPointMake(15.0f, 30.0f)]];

// min X: -5.0, max X: 20.0
// min Y: -15.0, max Y: 30.0

到目前为止,我有两种方法。第一个是将这四个值存储在类实例变量中,当添加新对象时,将其与那些变量进行比较并在必要时更新它们。第二种涉及用于查找极值的 for 循环,但是这种方法效率很低。

如果可能的话,我想使用 KVC 来完成这项任务,我相信这将是一个比我现有的解决方案更通用的解决方案。将来,我可能还需要从数组中删除一些对象,这会使我的第一种方法不适用,剩下的就是 for 循环。

我尝试使用一些关键路径,即 @"@max.x"@"@max.position.x" 但我得到的只是一个 NSUnknownKeyException.

最佳答案

如果您使用类别告诉 NSValue 如何访问 xy,您可以让它工作> CGPoint 的值:

@interface NSValue (MyKeyCategory)
- (id)valueForKey:(NSString *)key;
@end

@implementation NSValue (MyKeyCategory)
- (id)valueForKey:(NSString *)key
{
if (strcmp([self objCType], @encode(CGPoint)) == 0) {
CGPoint p = [self CGPointValue];
if ([key isEqualToString:@"x"]) {
return @(p.x);
} else if ([key isEqualToString:@"y"]) {
return @(p.y);
}
}
return [super valueForKey:key];
}
@end

然后

CGFloat maxx = [[yourArray valueForKeyPath:@"@max.x"] floatValue];

确实有效。但请注意,一个简单的循环会快得多,特别是如果您必须计算所有 4 个值 @max.x@max.y@min .x, @min.y

关于ios - 使用 KVC 在 NSArray 中获取 NSValue 转换的 CGPoints 的最小/最大坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16788229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com