Swift传递一个数组作为参数错误

时间:2018-01-10 19:59:39

标签: ios swift

我刚刚开始使用Swift。有人可以向我解释为什么我可以传递数组作为参数(byRoundingCorners :)

UIBezierPath(
        roundedRect: self.bounds,
        byRoundingCorners: [.topLeft, .bottomLeft],
        cornerRadii: CGSize(width: radius, height: radius))

但是在变量中传递它会产生错误

var corners = [UIRectCorner.topLeft, UIRectCorner.bottomLeft]
let path = UIBezierPath(
        roundedRect: self.bounds,
        byRoundingCorners: corners,
        cornerRadii: CGSize(width: radius, height: radius))

“无法将'[UIRectCorner]'类型的值转换为预期的参数类型'UIRectCorner'”

3 个答案:

答案 0 :(得分:3)

这不是一个阵列。这是一个OptionSetbyRoundingCorners参数需要UIRectCorner类型,其范围为OptionSet

如果您将corners的声明更新为:

var corners: UIRectCorner = [.topLeft, .bottomLeft]

然后您的代码将按预期工作。

[ ]语法在这里不是一个数组,它是该集的选项列表。

您的第一次尝试有效,因为编译器可以从参数中推断出数据类型(UIRectCorner)。

但是当你这样做的时候:

var corners = [UIRectCorner.topLeft, UIRectCorner.bottomLeft]

推断类型是UIRectCorner的数组,而不是UIRectCorner。通过将: UIRectCorner添加到该行,您可以清楚地知道该类型是什么,并且使用[ ]的语法被正确解释为选项列表而不是数组。

如Martin R所述(感谢),OptionSet扩展了ExpressibleByArrayLiteral,这允许使用类似数组的文字语法为UIRectCorner赋值。

答案 1 :(得分:2)

UIRectCorner中的

OptionSet,因此当您在函数调用中编写[.topLeft, .bottomLeft]时,Swift会自动从该数组文字中创建UIRectCorner的实例。

但是,当你写

var corners = [UIRectCorner.topLeft, UIRectCorner.bottomLeft]

您创建了一个UIRectCorner个选项集数组,而不是包含所有不同情况的单个选项集。

您可以通过将corners的类型指定为UIRectCorner来解决此问题。这也允许您推断数组文字中的类型:

var corners: UIRectCorner = [.topLeft, .topRight]

答案 2 :(得分:0)

针对有问题的人的Swift 5示例尝试追加并最终发现插入是解决可变情况的方法。

    var cornersToRound: UIRectCorner = []
    if topLeftRounded { cornersToRound.insert(.topLeft) }
    if topRightRounded { cornersToRound.insert(.topRight) }
    if bottomRightRounded { cornersToRound.insert(.bottomRight) }
    if bottomLeftRounded { cornersToRound.insert(.bottomLeft) }