Полагаю, вы не задаете эту строку: var rotatedViews: [RotatedView]()
animationView?.subviews
.compactMap({ $0 as? RotatedView })
.sorted(by: { $0.tag < $1.tag })
.forEach { itemView in
rotatedViews.append(itemView)
if let backView = itemView.backView {
rotatedViews.append(backView)
}
}
Давайте разберем цепочку и назовем некоторые промежуточные переменные, потому что делать это в одной строке круто, но иногда сложнее отладить, ив Objective-C это будет довольно грязно =>
let compacted = animationView?.subviews({ $0 as? RotatedView })
let sorted = compacted.sorted(by: { $0.tag < $1.tag })
sorted.forEach { itemView in
rotatedViews.append(itemView)
if let backView = itemView.backView {
rotatedViews.append(backView)
}
}
Итак, что там происходит:
compacted
: оставляйте только подпредставления класса RotatedView
.
sorted
: Мы сортируем тезисы по их tag
свойствам.
В последнем случае вы совершенно не поняли, что происходит.Нам пришлось rotatedViews
все предыдущие представления sorted
, и если у них есть backView
, мы тоже добавим его.
Не проверено (написано без отладчика / компилятора / XCode):
NSMutableArray *rotatedViews = [[NSMutableArray alloc] init]; //Final array
NSMutableArray *compacted = [[NSMutableArray alloc] init];
for (UIView *aView in animationView.subviews)
{
if ([aView isKindOfClass:[RotatedView class]])
{
[compacted addObject:aView];
}
}
NSArray *sorted = [compacted sortedArrayUsingComparator:^NSComparisonResult(RotatedView *view1, RotatedView *view2){
NSInteger tag1 = [view1 tag];
NSInteger tag2 = [view2 tag];
return [@(tag1) compare:@(tag2)];
}];
for (RotatedView *itemView in sorted) //That's equivalent to forEach( itemView in
{
[rotatedViews addObject:itemView]; //That's equivalent to rotatedViews.append(itemView)
UIView *backView = [itemView backView]; //That's equivalent to if let backView = itemView.backView
if (backView) //That's equivalent to if let backView = itemView.backView
{
[rotatedViews addObject:backView]; //That's equivalent to rotatedViews.append(backView)
}
}