【问题标题】:How to create an own struct and constants for this struct?如何为此结构创建自己的结构和常量?
【发布时间】:2012-04-04 16:13:02
【问题描述】:

我想创建一个类似于 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?

谢谢。

【问题讨论】:

  • 不是浮点数,但你听说过无符号类型吗?
  • 不要在你自己的类型上使用CG前缀;它属于 Core Graphics。

标签: objective-c struct components constants limit


【解决方案1】:

你可以像这样创建常量:

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 放在零结构上。
  • 谢谢,听起来很合乎逻辑。不明白为什么我自己没有提出这个想法。其实我可以把任何代码放在大括号之间,对吧?例如,如果超出限制,则更改为某个默认值。但我还有另一个问题。如果我想要一个通过 3 个角度(以度为单位)表示向量的结构,这意味着 x=(0;360),我可以将角度值转换为限制内的新值。但是如何为单个组件的设置器执行此操作,如本例中:CG3Vector a=CG3VectorMake(120,70,80); a.z=-20; //应该转化为360-20=340
  • 谢谢。但是 const CG3Vector CG3VectorZero = { 0, 0, 0 };不起作用。编译时出现链接器错误。我认为为此必须使用一些不同的语法。
  • 并且限制方法在创建 CG3Vector 变量时也有效,但在仅显式设置一个组件时不应用任何限制:vector.z=-20;然后 -20 保持 -20,而不是 340。
  • @BartoNaz 这是 C 结构的一个限制,您正在寻找的是 C++ 结构或 Objective-C 对象。就 CGVectorZero 而言,您可能需要查看外部变量,如下所述:stackoverflow.com/questions/2190919/mixing-extern-and-const
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
相关资源
最近更新 更多