【问题标题】:Swift pass an array as argument errorSwift 将数组作为参数传递错误
【发布时间】:2018-01-10 19:59:38
【问题描述】:

我刚刚开始使用 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'”

【问题讨论】:

  • 已经有足够的答案了,但有人可能会补充说 OptionSet(间接)从 ExpressibleByArrayLiteral 继承,这就是允许在初始化中传递文字数组的原因。

标签: ios swift


【解决方案1】:

这不是一个数组。这是一个OptionSetbyRoundingCorners 参数需要扩展 OptionSetUIRectCorner 类型。

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

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

那么您的代码将按预期工作。

[ ] 语法在这里并不是真正的数组,它是集合的选项列表。

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

但是当你这样做时:

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

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

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

【讨论】:

    【解决方案2】:

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

    但是,当你写的时候

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        • 2011-08-12
        • 2016-09-26
        相关资源
        最近更新 更多