提问者:小点点

如何将属性的类型限制为预定义的两种类型(UIColor或CAGradientLayer)


我试图将属性filling严格限制为UIColorCAGRadientLayer类型。 我可以使UIColorCAGRadientLayer符合某种协议来实现这一点,但是任何类型都可以符合该协议,这是不需要的。 实现以下目标的最佳方法是什么?

class A {
   var filling: (UIColor or CAGradientLayer)
   var width: CGFloat
}

class B {
   var arrayOfA: [A]

   init(arrayOfA: [A] {
       self.arrayOfA = arrayOfA
   }
}

let bObj1 = B(arrayOfA: [A(filling: UIColor.white, width: 5),
                         A(filling: CAGradientLayer(), width: 10)]) //allowed

let bObj2 = B(arrayOfA: [A(filling: UIColor.white, width: 5),
                         A(filling: AnyRandomType(), width: 10)]) //not allowed


共1个答案

匿名用户

这是具有关联值的enum的一个很好的用例:

enum Filling {
    case pureColor(UIColor)
    case gradient(CAGradientLayer)
}

您可以使用填充作为填充的类型:

var filling: Filling

// ...

let bObj1 = B(arrayOfA: [A(filling: .pureColor(.white), width: 5),
                         A(filling: .gradient(CAGradientLayer()), width: 10)]

要检查填充类型,请使用switch语句:

switch filling {
    case .pureColor(let color):
        ...
    case .gradient(let layer):
        ...
}