将 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,请告诉我那里发生了什么,我会转换它。
附: 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];
【问题讨论】:
因为您需要向我们展示您已经尝试过的内容以及您面临的问题。在您首先完成之前,我们不会查看代码并为您转换它,甚至不会尝试查看它。请查看提问的规则和指南 @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的主要内容,如果未能解决你的问题,请参考以下文章
Swift:链式 UIView 动画永远重复? Obj-C 代码不可移植