我正在使用NSRange(一个结构)并将其初始化为:
@interface MyViewController : UIViewController
{
NSRange currentRange;
}
NSRange有一个位置和长度字段。
如何检查结构是否已使用值初始化?我试过了:
if (myRange.length == nil)
但编译器抱怨将指针与整数进行比较。感谢。
答案 0 :(得分:9)
nil
是一个指针,但length
是一个整数,因此编译器警告。您可以将length
与0
进行比较,但这是NSRange
中长度的合法值。如果我需要currentRange
的“尚未初始化”值,我会选择将其设置为:
{ .location = NSNotFound, .length = 0 }
-init
中的。当然,这假设范围在操作过程中永远不会假设该值。如果范围真的可以在其域中使用任何值,那么您不能将它们中的任何一个用作“尚未初始化”的占位符。
您可以选择存储指向范围的指针,该范围为NULL,直到设置范围为止。另一种选择是使用状态模式来区分范围设置之前和之后的状态。另一种方法是设计类及其接口契约,使得范围在设置之后才被使用。
答案 1 :(得分:0)
你做不到。如果它没有被初始化,它将具有随机值,或者被初始化为零,这取决于编译器,因此没有安全的方法来检查。
答案 2 :(得分:0)
你基本上有两个选择:显式初始化结构(初始化位置到NSNotFound是一个很好的建议),或者使它成为一个指针。但是,你将为此管理堆内存,这可能比你讨价还价更多。
哲学上,在初始化之前进行任何类型的比较都是在乞求麻烦。即使这是一个指针,我仍然(个人)明确地将其初始化为零。在MyViewController的-init方法中,你有没有理由不咬苹果?
答案 3 :(得分:0)
一个可能的解决方案是在某个地方存储该结构的规范初始化实例并与之进行比较。除了初始化之外,你还有一个问题就是你不应该对未初始化的内存做任何事情。