Как ограничить тип свойства двумя предопределенными типами (UIColor или CAGradientLayer) - PullRequest
1 голос
/ 20 июня 2020

Я пытаюсь строго ограничить свойство 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

1 Ответ

4 голосов
/ 20 июня 2020

Это отличный вариант использования enum со связанными значениями:

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

Вы можете использовать Filling как тип filling:

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):
        ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...