早上好,我正在查看目标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
再次感谢您的帮助;
答案 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:
等时的情况相同。您应该始终为这些实现调用超类实现。