Переведите UIView анимационный код Swift в Objective-C - PullRequest
0 голосов
/ 12 июня 2018

Мне нужно перевести этот код Swift в Objective-C.

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, пожалуйста, скажите мне, что там происходит, я конвертирую его.

PS rotatedView - это класс UIView, а rotatedViews - это пустой массив типа rotatedView.

Как подсказывает @Haris Nadeem, я делюсь тем, что я сделал до сих пор.

NSMutableArray *dummy = [[NSMutableArray alloc]init];
for(id view in self.animationView.subviews){
    if([view isKindOfClass:[RotatedView class]])
        [dummy addObject:(RotatedView *)view];
}
for(RotatedView *preView in dummy ){
//        if( view.tag>preView.tag){
//            [dummy addObject:view];
//            preView.tag=view.tag;
}
for( RotatedView *iteamView in [rotatedViews addObject:iteamView]){
     if (preView.backView ==  iteamView.backView)
         [rotatedViews addObject:preView.backView];
}
}

1 Ответ

0 голосов
/ 13 июня 2018

Полагаю, вы не задаете эту строку: 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)
    }
}
...