ios - Swift 将数组作为参数传递错误

标签 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’”

最佳答案

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

如果您将 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/

相关文章:

iOS 右导航按钮不显示在 UINavigationBar 中

macos - 注册网络历史记录通知处理程序时引发意外异常,出了什么问题?

arrays - Swift 错误 - 对成员 'subscript' 的引用不明确

swift - 通过用户名 : Firebase, Swift 登录

ios - fatal error : Invariant violated: opaque small strings

ios - 将导航 Controller 与标签栏 Controller 一起使用

ios - 捕获了 UIBarButtonItem 的 Action

ios - 出现时键盘高度会发生变化

ios - 在带有消息的远程通知中显示超链接

ios - native iOS 应用程序和服务器之间的安全性