Obj C to Swift转换

时间:2018-05-23 12:07:29

标签: objective-c swift for-loop

目标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
        }
    }
}

3 个答案:

答案 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
        }
    }
}