我试图将属性filling
严格限制为UIColor
或CAGRadientLayer
类型。 我可以使UIColor
和CAGRadientLayer
符合某种协议来实现这一点,但是任何类型都可以符合该协议,这是不需要的。 实现以下目标的最佳方法是什么?
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
这是具有关联值的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):
...
}