Objective c 如何为此结构创建自己的结构和常量?

Objective c 如何为此结构创建自己的结构和常量?,objective-c,struct,components,constants,limit,Objective C,Struct,Components,Constants,Limit,我想创建一个类似于CGPoint的结构,但是有3个坐标,而不是2个 我用以下方式创建它: typedef struct {CGFloat x;CGFloat y;CGFloat z;} CG3Vector; CG_INLINE CG3Vector CG3VectorMake(CGFloat x, CGFloat y, CGFloat z) { CG3Vector p; p.x = x; p.y = y; p.z = z; return p; } 它很好用。但是我现在想改进这个结构,使它具

我想创建一个类似于CGPoint的结构,但是有3个坐标,而不是2个

我用以下方式创建它:

typedef struct {CGFloat x;CGFloat y;CGFloat z;} CG3Vector;

CG_INLINE CG3Vector CG3VectorMake(CGFloat x, CGFloat y, CGFloat z)
{
  CG3Vector p; p.x = x; p.y = y; p.z = z; return p;
}
它很好用。但是我现在想改进这个结构,使它具有类似CGPoint的常量:
CGPointZero

还有什么方法可以为结构的特定组件引入限制,比如CGSize,其中组件永远不低于0


谢谢。

您可以创建如下常量:

const CG3Vector CG3VectorZero = { 0, 0, 0 };
CG_INLINE CG3Vector CG3VectorMake(CGFloat x, CGFloat y, CGFloat z)
{
    // normalize the values
    x = fmod(x, 360);
    y = fmod(y, 360);
    z = fmod(z, 360);

    x = (x < 0) ? 360 + x : x;
    y = (y < 0) ? 360 + y : y;
    z = (z < 0) ? 360 + z : z;

    return (CG3Vector) { x, y, z };
}
如果您想要限制,我想您可以进行如下检查:

const CG3Vector CG3VectorZero = { 0, 0, 0 };
CG_INLINE CG3Vector CG3VectorMake(CGFloat x, CGFloat y, CGFloat z)
{
    // normalize the values
    x = fmod(x, 360);
    y = fmod(y, 360);
    z = fmod(z, 360);

    x = (x < 0) ? 360 + x : x;
    y = (y < 0) ? 360 + y : y;
    z = (z < 0) ? 360 + z : z;

    return (CG3Vector) { x, y, z };
}
CG_内联CG3Vector CG3VectorMake(CGFloat x、CGFloat y、CGFloat z)
{
//标准化值
x=fmod(x,360);
y=fmod(y,360);
z=fmod(z,360);
x=(x<0)?360+x:x;
y=(y<0)?360+y:y;
z=(z<0)?360+z:z;
返回(CG3Vector){x,y,z};
}

不适用于浮点,但您听说过无符号类型吗?不要在您自己的类型上使用
CG
前缀;它属于核心图形。可能值得将
const
放在zero结构上。谢谢,听起来很合乎逻辑。我不明白为什么我自己没有想出这个主意。事实上,我可以把任何代码放在花括号之间,对吗?例如,如果超出限制,则更改为某个默认值。但我还有一个问题。如果我想要一个结构来表示一个向量,它通过3个角度表示x=(0;360),我可以将角度值的变换放到限制内的新值。但是如何对单个组件的setter执行此操作,如本例中所示:cg3vectora=CG3VectorMake(120,70,80);a、 z=-20//应转换为360-20=340股。但是直线常数CG3Vector CG3VectorZero={0,0,0};不起作用。我在编译时遇到链接器错误。我认为为此必须使用一些不同的语法,并且在创建CG3Vector变量时,限制方法也可以工作,但是当只显式设置一个组件时,它不会应用任何限制:vector.z=-20;然后,20个逗留- 20,而不是340。@ BartoNaz是C结构的限制,您要寻找的是C++结构或Objtovi-C对象。就CGVectorZero而言,您可能希望查看外部变量,如下所述: