为什么UIButton.layer.maskedCorners接受赋值显式数组而不是数组变量?



在 Swift 中为什么这样做?

let button = UIButton()
button.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMinXMinYCorner]

这不行吗?

let corners : [CACornerMask] = [.layerMinXMaxYCorner, .layerMinXMinYCorner]
let button = UIButton()
button.layer.maskedCorners = corners

即显式将数组分配给maskedCorners很好,但分配数组变量则不然。

错误是:

无法将类型"[CACornerMask]"的值分配给类型"CACornerMask" 按钮.图层.遮罩角 = 角

您的corners常量是错误的类型。[CACornerMask]使它成为一个CACornerMask.您希望它是类型CACornerMask。它被声明为 type NS_OPTIONS,它被映射到 Swift 选项集。(OptionSet)

代码[.layerMinXMaxYCorner, .layerMinXMinYCorner]看起来像数组语法,但事实并非如此。它是语义糖,允许您将不同的位掩码指定到 C 标志变量中(这是 Swift 选项集映射到的内容)。

引用 Apple 的文档:"Swift 还会导入标有 NS_OPTIONS 宏的 C 枚举作为 Swift 选项集">

摘自:Apple Inc. "Using Swift with Cocoa and Objective-C (Swift 4 beta)." iBooks.

你应该试试

let corners : CACornerMask = [.layerMinXMaxYCorner, .layerMinXMinYCorner]
let button = UIButton()
button.layer.maskedCorners = corners

将错误的类型分配给所需的类型

好吧,我为这个问题做了一个解决方案。

创建 UIView 的扩展

extension UIView{

enum RoundCornersAt{
case topRight
case topLeft
case bottomRight
case bottomLeft
}

//multiple corners using CACornerMask
func roundCorners(corners:[RoundCornersAt], radius: CGFloat) {
self.layer.cornerRadius = radius
self.layer.maskedCorners = [
corners.contains(.topRight) ? .layerMaxXMinYCorner:.init(),
corners.contains(.topLeft) ? .layerMinXMinYCorner:.init(),
corners.contains(.bottomRight) ? .layerMaxXMaxYCorner:.init(),
corners.contains(.bottomLeft) ? .layerMinXMaxYCorner:.init(),
]
}

}

现在您可以使用它。

let corners:[UIView.RoundCornersAt] = [.topLeft,.bottomRight]
button.roundCorners(corners: corners, radius: 20)

最新更新