Swift 类型';NSArray?.Type';不符合协议';序列';

Swift 类型';NSArray?.Type';不符合协议';序列';,swift,Swift,从Objective-C转换后,我在Swift中面临问题。有人能帮我解决这个问题吗 var panels = NSArray? func buttonTotalWidth() -> CGFloat { var width: CGFloat = 0 for panel: UIView? in panels { width += panel?.frame.width } return width

从Objective-C转换后,我在Swift中面临问题。有人能帮我解决这个问题吗

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;
}

此方法接受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
}
如果这些是一些可选的UIView,请尝试以下操作:

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

此方法接受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
}
如果这些是一些可选的UIView,请尝试以下操作:

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

请不要试图将ObjC代码逐字翻译成Swift。学习Swift的具体内容

一个快速的翻译可能是

var panels = [UIView]()

func buttonTotalWidth() -> CGFloat {
    return panels.map{$0.frame.width}.reduce(0.0, + )
}

请不要试图将ObjC代码逐字翻译成Swift。学习Swift的具体内容

一个快速的翻译可能是

var panels = [UIView]()

func buttonTotalWidth() -> CGFloat {
    return panels.map{$0.frame.width}.reduce(0.0, + )
}

NSArray?.self
不创建数组。如果您想要一个
[UIView?]
数组,那么您可以执行
var panels=[UIView?]()
@查看我的目标C代码将值分配给
panels
属性的代码看起来像什么?
NSArray?。self
不创建数组。如果您想要一个
[UIView?]
数组,那么您可以执行
var panels=[UIView?]()
@dan Look it my objective C code将值分配给
panels
属性的代码是什么样的?