逻辑运算符Objective-C

逻辑运算符Objective-C,objective-c,logic,Objective C,Logic,伙计们,谁能给我解释一下如果发生了什么!来源意味着请 -(void) setOrigin: (XYPoint *) pt { if (! origin) origin = [[XYPoint alloc] init]; origin.x = pt.x; origin.y = pt.y; } 如果没有来源的话在if语句中,表示如果这不是真的 您的代码所做的是检查是否存在原点,如果没有原点,它将创建一个新原点。这样做很好的原因是因为您

伙计们,谁能给我解释一下如果发生了什么!来源意味着请

-(void) setOrigin: (XYPoint *) pt {
        if (! origin)
        origin = [[XYPoint alloc] init];
        origin.x = pt.x; origin.y = pt.y;
        }
如果没有来源的话在if语句中,表示如果这不是真的

您的代码所做的是检查是否存在原点,如果没有原点,它将创建一个新原点。这样做很好的原因是因为您不想制作多个原点


希望这有帮助。如果您还有任何问题,请随时提问:

张贴的代码读起来很有趣。从外部看,该方法似乎承诺将某个对象的原点属性设置为传递点pt的值。在内部,似乎只有在尚未设置“原点”特性时才会这样做

关于‘!’“砰”或“不”操作符,在最低级别!非零的测试。当应用于布尔值时,如YES或NO,它们实际上是标量1或0,它充当逻辑NOT运算

!YES is the same as !1 and equals NO
!NO is the same as !0 and equals YES
在问题的代码中!习惯性地应用于非标量值和对象指针,但它在低级执行相同的操作,测试非零性,在本例中为非零:

SomeObject *someObject = nil;

!someObject is the same as !nil and the same as !0 and equals YES
如果已分配对象,则指针someObject具有非零值,因此

SomeObject *someObject = [SomeObject alloc];

!someObject equals NO
这个习惯用法的一个常见用法是lazygetter。属性最初为nil,然后在第一次请求时提供非nil值

- (NSString *)someStringProperty {
    if (!_someStringProperty) {
        // this runs the first time, but not again because we set
        // _someStringProperty to be non-nil here
        _someStringProperty = @"hello world";
    }
    return _someStringProperty;
}

你看过语言文档了吗?