我刚刚开始使用 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
。 byRoundingCorners
参数需要一种扩展 OptionSet
的 UIRectCorner
。
如果您将 corners
的声明更新为:
var corners: UIRectCorner = [.topLeft, .bottomLeft]
然后您的代码将按预期工作。
[ ]
语法在这里并不是真正的数组,它是集合的选项列表。
您的第一次尝试成功了,因为编译器可以从参数中推断出数据类型 (UIRectCorner
)。
但是当你这样做的时候:
var corners = [UIRectCorner.topLeft, UIRectCorner.bottomLeft]
推断的类型是UIRectCorner
的数组,而不是UIRectCorner
。通过将 : UIRectCorner
添加到该行,您可以明确类型是什么,并且使用 [ ]
的语法被正确解释为选项列表而不是数组.
正如 Martin R(感谢)所提到的,OptionSet
扩展了 ExpressibleByArrayLiteral
,它允许使用类似数组的文字语法为 赋值UIRectCorner
.
关于ios - Swift 将数组作为参数传递错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48195165/