将 UIView 动画 Swift 代码翻译成 Objective-C

Posted

技术标签:

【中文标题】将 UIView 动画 Swift 代码翻译成 Objective-C【英文标题】:Translate UIView animation Swift code to Objective-C 【发布时间】:2018-06-12 05:56:14 【问题描述】:

我需要将此 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,请告诉我那里发生了什么,我会转换它。

附: rotatedViewUIView 的类,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];


【问题讨论】:

因为您需要向我们展示您已经尝试过的内容以及您面临的问题。在您首先完成之前,我们不会查看代码并为您转换它,甚至不会尝试查看它。请查看提问的规则和指南 @HarisNadeem 我在寻找 compactMap 函数,首先它在目标 c 中不可用,其次我无法从苹果开发人员那里理解。所以我无法转换它。据我所知,$0 是该集合的第一个元素,$1 是发送元素,append 是在数组末尾添加对象。在编写目标 c 时,这些代码中有很多 for 循环(根据我的理解),我很困惑。所以我问了,但投票否决导致问题搁置。 让我们翻译一下:compactMap() 看看useyourloaf.com/blog/replacing-flatmap-with-compactmap 为什么使用它。 sorted(),当它根据 tag 属性排序时。 forEach() 似乎是一个明确的名称。 @Larme 谢谢哥们。你能解释一下这些行是什么: $0 as? RotatedView 在上面的上下文中。 迭代并只保留 RotatedView 类的对象。 【参考方案1】:

我猜你没有给出这条线: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)
    

【讨论】:

非常感谢朋友!为了解释这样一个好方法......小修正 tag1 和 tag2 将是 NSInteger 的类型。是的,它可以编译?? 我修复了let -> NSInteger,感谢您发现它。

以上是关于将 UIView 动画 Swift 代码翻译成 Objective-C的主要内容,如果未能解决你的问题,请参考以下文章

UIView 动画 swift 4 Xcode9 的问题

Swift:链式 UIView 动画永远重复? Obj-C 代码不可移植

Swift 3 UIView 动画

Swift3 中的 UIView 动画

UiView.animateWithDuration 不为 Swift3 设置动画

无法将目标 C 代码段翻译成 Swift