目标C:
- (void)stickerViewDidTapDeleteControl:(StickerView *)stickerView {
NSLog(@"Tap[%zd] DeleteControl", stickerView.tag);
for (UIView *subView in self.view.subviews)
{
if ([subView isKindOfClass:[StickerView class]])
{
[(StickerView *)subView performTapOperation];
break;
}
}
}
我在目标C中使用这一行,它的工作正常,但是当我将它转换为Swift 4.它没有用。
以下是从Objective c转换而来的快速代码。
func stickerViewDidTapDeleteControl(_ stickerView: StickerView?) {
if let aTag = stickerView?.tag {
print("Tap[\(aTag)] DeleteControl")
}
for subView: UIView? in self.view.subviews
{
if (subView is StickerView)
{
let subViewNew: StickerView? = subView as? StickerView
subViewNew?.performTapOperation()
break
}
}
}
答案 0 :(得分:2)
实际上你可以在一行中编写Swift版本
self.view.subviews.compactMap{$0 as? StickerView}.forEach{ $0.performTapOperation() }
compactMap
过滤StickerView
项,forEach
调用每个项目的方法。
要考虑break
语句 - 只调用一次方法 - 使用
self.view.subviews.compactMap{$0 as? StickerView}.first?.performTapOperation()
如果subviews
不包含任何StickerView
项,则由于可选链接,该行不执行任何操作。
答案 1 :(得分:0)
你可以试试这个(更多' swifty'):
let stickerViews = self.view.subviews.filter{$0 is StickerView}
stickerViews.forEach { $0.performTapOperation() }
(在浏览器中输入,未经测试)
答案 2 :(得分:-1)
如果不工作,我认为你的意思是没有调用performTapOperation
方法。
首先,在你的for循环中,没有必要进行强制转换,因为subviews
数组已经是UIView
的数组。
然后,您只需使用可选绑定(包含break
的原始代码表明您的子视图中只有一个StickerView
。
func stickerViewDidTapDeleteControl(_ stickerView: StickerView?) {
if let aTag = stickerView?.tag {
print("Tap[\(aTag)] DeleteControl")
}
for subView in self.view.subviews
{
if let subViewNew = subView as? StickerView {
subViewNew.performTapOperation()
break
}
}
}