Ios typedef结构与对象-好处

Ios typedef结构与对象-好处,ios,objective-c,struct,Ios,Objective C,Struct,我计划定义一个类,它的属性中包含x/y网格的坐标。然而,我不确定这种设计的“最佳”方式。这是一个非常简单的问题,我只想做正确的,并有一个理由 一种解决方案是在对象中必须有两个属性,类型为“int”,一个用于x,一个用于y 另一种方法是定义一个包含x/y值的两个整数的typedef结构,并将其命名为Coordinate。类似于CGSize 有没有其他/更好的方法来做到这一点?哪个是首选?不知道如何证明这两种方法的合理性 谢谢 蒂姆。关于“哪一个更受欢迎?”问题的答案取决于几个因素: 您计划创建多

我计划定义一个类,它的属性中包含x/y网格的坐标。然而,我不确定这种设计的“最佳”方式。这是一个非常简单的问题,我只想做正确的,并有一个理由

一种解决方案是在对象中必须有两个属性,类型为“
int
”,一个用于x,一个用于y

另一种方法是定义一个包含x/y值的两个整数的typedef结构,并将其命名为
Coordinate
。类似于
CGSize

有没有其他/更好的方法来做到这一点?哪个是首选?不知道如何证明这两种方法的合理性

谢谢

蒂姆。

关于“哪一个更受欢迎?”问题的答案取决于几个因素:

  • 您计划创建多少这样的项目?-如果答案是“百万”,则
    struct
    获胜;如果答案是“五十八”,那么object赢了
  • 您需要在其上定义方法吗?-如果答案为“是”,则对象获胜;否则,
    struct
    可能正常
  • 您计划定义它的数组吗?-如果答案是“是”,那么
    struct
    可能是更好的选择
  • 您需要经常创建和销毁它吗?-如果答案是“是”,那么
    struct
    可能是更好的选择
最终,您的设计约束将帮助您确定什么是最好的;没有一种数据结构是普遍“更好”的。

这是一种折衷

一个类及其实例将花费更多的资源,尤其是当您必须制作大量实例时。如果不会有这么多的例子,这不是一个问题

结构更快,但很难扩展,最不方便的是结构不能容纳对象或方法


对于您的示例,如果您只是将其用于坐标,我建议您使用struct。但这取决于您的设计和代码。没有绝对的判断是最好的。

除了@dasblinkenlight-response,我会给你一些决策建议:

  • 结构在创建后是不可变的吗?
    请使用对象

  • 该结构是否拥有(=保留)指向其他对象或数组(C数组或
    NSArray
    )的指针?它是否与对象交互(=具有具有对象参数的方法)?
    然后使用对象

  • 结构是否只包含基元类型(
    int
    float
    、其他
    struct
    s等),并且它只与其他基元/结构交互?
    然后将
    struct
    与函数一起使用


为什么不直接使用
CGPoint
呢?我考虑过CGPoint,但我认为这是UIView中的x/y坐标,而不是我自己定制的网格系统中的坐标,所以它不会误用核心图形值吗?如果不是。。。那么这是一个没有问题的问题
CGPoint
只是一个结构,因此您可以按照自己喜欢的方式使用它,而不会在CG中真正“弄乱”东西。一个好办法是
typedef-CGPoint-MyOwnPointType
让它像你自己的类型一样工作,避免混合使用。谢谢,我想我会选择CGPoint上的typedef方法,只是为了区分CG和我自己的使用。回答得好。我将定义这些网格项的数组,可能没有数百万个,但远远超过100个!我确实认为,从性能的角度来看,使用struct可能更有益。根据sergio的评论,我将在CGPoint上定义一个typedef。@Tim因为
CGPoint
使用
double
s,并且您需要
int
s,所以我将避免将两者“结合”,并定义我自己的结构。这将使您避免在将
结构外部化时遇到麻烦(例如,将其保存到文件或通过网络发送),因为它将保护您免受苹果可能想在您背后进行的更改。当然,如果它对您来说并不重要,并且您的结构表示的点的范围适合
CGFloat
,那么您可以在没有自己的
typedef
的情况下“批量”重用
CGPoint
,因为在大多数情况下
typedef
没有提供足够的“隔离”。不确定“您是否计划定义它的数组?”这是个好问题。结构数组和对象数组都被广泛使用。@Sulthan确实如此,但是
struct
s数组往往更紧凑,可以在自动内存中定义(即在堆栈上),而且复制成本更低。当然,这不是一个明确的决定,这就是为什么我写了“可能是一个更好的选择”,而不是“是一个更好的选择”。谢谢,这证实了struct绝对是我应该选择的。虽然,如果它在创建后是不可变的,那么结构肯定是最好的,而不是像上面那样的对象?@Tim没有办法确保
结构的不可变性,因此当需要不可变性时,你必须选择对象。啊,好的,这是有意义的。谢谢