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

Ios 如何将特性的类型限制为预定义的两种类型(UIColor或CAGradientLayer),ios,swift,Ios,Swift,我试图严格限制属性填充为UIColor或CAGradientLayer类型。我可以使UIColor和CAGradientLayer符合某些协议来实现这一点,但任何类型都可以符合不需要的协议。实现以下目标的最佳方法是什么 class A { var filling: (UIColor or CAGradientLayer) var width: CGFloat } class B { var arrayOfA: [A] init(arrayOfA: [A] {

我试图严格限制属性填充为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 Filling {
    case pureColor(UIColor)
    case gradient(CAGradientLayer)
}
您可以使用填充作为填充类型:

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

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

这是带有关联值的枚举的一个很好的用例:

enum Filling {
    case pureColor(UIColor)
    case gradient(CAGradientLayer)
}
您可以使用填充作为填充类型:

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

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

A是否检查填充类型,并将填充铸造到正确的类型?了解A如何使用填充将非常有帮助。@Sweeper在B类中的某个地方,我将检查填充的类型,并相应地填充某些视图的背景。因此,如果它是UIColor,我将设置backgroundColor,如果它是CAGradientLayer,我将添加该层作为子层,并作为背景。A是否检查填充类型,并将填充类型转换为正确的类型?了解A如何使用填充将非常有帮助。@Sweeper在B类中的某个地方,我将检查填充的类型,并相应地填充某些视图的背景。所以,如果是UIColor,我将设置backgroundColor,如果是CAGradientLayer,我将添加该层作为子层,并作为背景。