Тип «NSArray? .Type» не соответствует протоколу «Sequence» - PullRequest
0 голосов
/ 01 мая 2018

Я столкнулся с проблемой в Swift после конвертации из Objective-C. Может кто-нибудь помочь мне решить эту проблему?

var panels = NSArray?

func buttonTotalWidth() -> CGFloat {
        var width: CGFloat = 0
        for panel: UIView? in panels {
            width += panel?.frame.width
        }
        return width
    }

Код моей цели C

@property NSArray *panels;

- (CGFloat)buttonTotalWidth {
    CGFloat width = 0;
    for (UIView *panel in self.panels) {
        width += CGRectGetWidth(panel.frame);
    }
    return width;
}

Error Screen

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Пожалуйста, не пытайтесь переводить код ObjC буквально в Swift. Изучите специфический материал Swift.

A swifty перевод может быть

var panels = [UIView]()

func buttonTotalWidth() -> CGFloat {
    return panels.map{$0.frame.width}.reduce(0.0, + )
}
0 голосов
/ 02 мая 2018

Этот метод принимает массив UIView (а не необязательный UIVIew), попробуйте это

var panels = self.view.subviews
var width = buttonTotalWidth(panels)

func buttonTotalWidth(_ panels: [UIView]) -> CGFloat {
    var width: CGFloat = 0
    for panel: UIView in panels.enumerated() {
        width += panel.frame.width
    }
    return width
}

если это какие-то дополнительные UIViews, попробуйте это,

func buttonTotalWidth(_ panels: [UIView?]) -> CGFloat {
    var width: CGFloat = 0
    for panel: UIView? in panels.enumerated() {
        width += panel?.frame.width
    }
    return width
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...