Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c CGPoint的不变替代方案?_Objective C_Core Graphics_Immutability_Cgpoint - Fatal编程技术网

Objective c CGPoint的不变替代方案?

Objective c CGPoint的不变替代方案?,objective-c,core-graphics,immutability,cgpoint,Objective C,Core Graphics,Immutability,Cgpoint,如问题所述,我更喜欢不可变版本的CGPoint、CGSize和CGRect,尽管我更喜欢使用iOS框架支持的类型,以避免在类型之间转换 那么,是否有任何受支持的不可变版本的CGPoint?若否,有何建议? 谢谢 您可以使用常量CGPoints等 例如: 使用CGSizeMake不会起作用,因为它们不是编译时常量,也不能使用变量,但这是最接近不可变的CGSize。如果这还不够好,那么您需要使用对象,并在需要时进行转换。您可以使用常量CGPoints等 例如: 使用CGSizeMake不会起作用,因

如问题所述,我更喜欢不可变版本的
CGPoint
CGSize
CGRect
,尽管我更喜欢使用iOS框架支持的类型,以避免在类型之间转换

那么,是否有任何受支持的不可变版本的
CGPoint
?若否,有何建议?


谢谢

您可以使用常量
CGPoint
s等

例如:


使用CGSizeMake不会起作用,因为它们不是编译时常量,也不能使用变量,但这是最接近不可变的
CGSize
。如果这还不够好,那么您需要使用对象,并在需要时进行转换。

您可以使用常量
CGPoint
s等

例如:

使用CGSizeMake不会起作用,因为它们不是编译时常量,也不能使用变量,但这是最接近不可变的
CGSize
。如果这还不够好,则需要使用对象并在需要时进行转换。

当CGPoint(或任何其他结构-CGRect等)是Objective-C对象的属性时,getter/setter方法的机制和C结构的值语义意味着存在某种程度的保护,防止间接修改对象的CGPoint属性的值。例如,像
someObject.someCGPointProperty.x=123
这样的表达式实际上不会修改
someObject
拥有的CGPoint的
x
值,因为
someCGPointProperty
访问器将逐个值返回CGPoint,这意味着您正在设置CGPoint副本上的x值。要实际修改该对象拥有的CGPoint,您需要执行以下操作:

CGPoint point = someObject.someCGPointProperty;
point.x = 123;
someObject.someCGPointProperty = point;
关于对您创建的实例数量的控制:因为CGPoint是一个结构,所以它是通过函数参数或Objective-C消息中的值传递的(实际上是复制的)。所以无论如何,会有大量的结构副本在移动。但是,这些结构是在堆栈上创建的,而不是在堆上创建的,并且CGPoint只有16个字节(在32位iOS设备上可能更小?),因此您不必担心任何性能影响

此外,请参阅@hypercrypt关于
常数
值的更简洁的回答,因为这可以很好地解决您的意图。

当CGPoint(或任何其他结构-CGRect等)是Objective-C对象的属性时,getter/setter方法的机制和C结构的值语义意味着存在某种程度的保护,防止间接修改对象的CGPoint属性的值。例如,像
someObject.someCGPointProperty.x=123
这样的表达式实际上不会修改
someObject
拥有的CGPoint的
x
值,因为
someCGPointProperty
访问器将逐个值返回CGPoint,这意味着您正在设置CGPoint副本上的x值。要实际修改该对象拥有的CGPoint,您需要执行以下操作:

CGPoint point = someObject.someCGPointProperty;
point.x = 123;
someObject.someCGPointProperty = point;
关于对您创建的实例数量的控制:因为CGPoint是一个结构,所以它是通过函数参数或Objective-C消息中的值传递的(实际上是复制的)。所以无论如何,会有大量的结构副本在移动。但是,这些结构是在堆栈上创建的,而不是在堆上创建的,并且CGPoint只有16个字节(在32位iOS设备上可能更小?),因此您不必担心任何性能影响

另外,请参阅@hypercrypt关于
const
值的更简洁的回答,因为这可以很好地解决您的意图。

您可以使用包装器类。它可以包裹点、大小、矩形等。它是不可变的,所以存储在它里面的任何东西都不能更改(请记住,如果存储指针,那么指向的内存区域仍然可以更改)

示例

NSValue* value= [NSValue valueWithCGPoint: CGPointMake(x,y)];
如果试图设置
value.CGPointValue.x
或y,则会出现编译错误。getter只返回对象中保存的
CGPoint
的副本,因此无法更改其值。

您可以使用包装器类。它可以包裹点、大小、矩形等。它是不可变的,所以存储在它里面的任何东西都不能更改(请记住,如果存储指针,那么指向的内存区域仍然可以更改)

示例

NSValue* value= [NSValue valueWithCGPoint: CGPointMake(x,y)];

如果试图设置
value.CGPointValue.x
或y,则会出现编译错误。getter只返回对象中持有的
CGPoint
的一个副本,因此无法更改其值。

您想保护什么?不,没有这样的野兽;这些不是对象,它们只是C风格的结构。我计划一次处理多个2D点,其中许多实际上可能代表同一点。这带来了两个主题:(a)如果我知道没有人可以在创建后修改它们,我会睡得更香;(b)我想控制创建实例的数量,如果可能的话,更愿意多次使用同一实例。(c)我实际上想使用这些点在屏幕上绘制多边形,这就是为什么我必须在某个时候使用
CGPoint
的原因。你想保护什么?不,没有这样的野兽;这些不是对象,它们只是C风格的结构。我计划一次处理多个2D点,其中许多实际上可能代表同一点。这带来了两个主题:(a)如果我知道没有人可以在创建后修改它们,我会睡得更容易;(b)我想控制创建实例的数量,如果可能的话,我更愿意多次使用同一实例。(c)我实际上想用这些点在屏幕上绘制多边形,这就是为什么我必须告诉我们的原因