self.property = self.property in objective c

时间:2016-02-08 16:21:55

标签: ios objective-c class properties

早上好,我正在查看目标c中的一些旧代码,我无法找到以下内容。

该类是UIView的子类,并遵循UIScrollViewDelegate协议。以下是我有一些问题的类方法:

@property(nonatomic, strong) NSDate * _Nonnull date;

- (void)layoutSubviews {
    [super layoutSubviews];

    if(!self.pagingView) {
        UIScrollView *pagingView = [[UIScrollView alloc] initWithFrame:self.bounds];
        pagingView.pagingEnabled = YES;
        pagingView.directionalLockEnabled = YES;
        pagingView.delegate = self;
        [pagingView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
        [self addSubview:pagingView];
        self.pagingView = pagingView;
    }

    CGRect f = self.pagingView.bounds;
    CGSize s = self.pagingView.contentSize;
    if(s.width != f.size.width * 3) {
        self.date = self.date;
        }
}

首先,我不确定[super layoutSubviews]是什么,我不确定self.date = self.date正在尝试做什么。它只是自己设置?如果是这样,我无法使用swift工作。 (我正在尝试将代码转换为)

https://github.com/Daij-Djan/DDCalendarView/blob/master/DDCalendarView_objc/DDCalendarView.m

再次感谢您的帮助;

2 个答案:

答案 0 :(得分:5)

在Objective-C中,点表示法是属性访问器方法调用的简写(语法糖)。您发布的内容可以改写为:

if width != size.width * 3 {
    [self setDate:[self date]];
}

换句话说,date属性的当前值将被传递回日期属性 setter 。在典型的代码中,这不会做任何事情。如果没有看到日期设定器(和/或getter)方法的实现,就不可能说出为什么你正在看的代码正在这样做。但是,我的猜测是日期设定器具有在其被调用时随时触发的副作用,因此这是触发该副作用而不改变属性值的便捷​​方式。

假设是这种情况,我想补充说这不是很好的代码。在至少,应该有一个评论来解释这是做什么的。更好的方法是打破其自身方法中发生的任何副作用,以便即使在不应更改属性值的情况下,也可以显式调用它而不是依赖于日期设置器。

答案 1 :(得分:3)

查看您发布的代码,setDate:方法正在执行一些视图设置,因此执行self.date = self.date;是作者在不更改设置日期的情况下强制执行此设置的方法。如果将视图设置代码从setDate:中分解出来,那么这样做会更好,因此在设置新日期后,它只会调用此设置。然后在上面的代码中,它可以简单地调用该安装方法,例如updateDateViews或类似的东西。

至于你关于调用[super layoutSubviews];的代码的问题,任何时候覆盖调用超类实现的方法总是一个好主意,除非你确定超类实现做了什么,你知道你不需要打电话,在极少数情况下特别不想打电话。因此,一个好的经验法则是始终将调用添加到超类方法中。它与覆盖viewWillAppear:viewWillDisappear:等时的情况相同。您应该始终为这些实现调用超类实现。