Как я могу проверить тип CGColor / CGPath?

Так что, по-видимому, существует ошибка в swift, связанная с типами CoreFoundation. Исходя из описания, похоже, нет проверки типов для CGPath и CGColor, ниже приведен фрагмент ошибки, демонстрирующий поведение.

func check(a: AnyObject) -> Bool {
    return a is CGColor
}

check("hey") --> true
check(1.0) --> true
check(UIColor.redColor()) --> true

И вот что я пытаюсь сделать

if let value = self.valueForKeyPath(keyPath) {
    if let currentValue = value as? CGColor {
        // Do Something with CGColor
    } else if let currentValue = value as? CGSize {
        // Do Something with CGSize
    } else  if let currentValue = value as? CGPoint {
        // Do Something with CGPoint
    }
}

Я сделал следующее: проверяя типы, сначала работают известные мне типы, затем помечают тегом последний оператор для AnyObject и проверяют CFTypeID. Пока это работает, но в документации Apple говорится, что CFTypeID может измениться, и на него не следует полагаться.

    if let currentValue = value as? CGPoint {
        // Do Something with CGPoint
    } else if let currentValue = value as? CGSize {
        // Do Something with CGSize
    } else if let currentValue = value as? AnyObject {
         if CFGetTypeID(currentValue) == 269 {
              // Cast and do Something with CGColor  
              methodCall((currentValue as! CGColor))
         }
   }

Кто-нибудь нашел надежное решение этой проблемы? Поскольку я не хочу использовать этот хак в качестве долгосрочного решения

1 ответ

Решение

Apple пишет:

Поскольку значение для идентификатора типа может изменяться от выпуска к выпуску, ваш код не должен полагаться на сохраненные или жестко закодированные идентификаторы типа, а также не должен жестко кодировать любые наблюдаемые свойства идентификатора типа (например, такие как маленькое целое число).

Это означает, что вы должны получить идентификатор типа во время выполнения, в вашем случае:

if CFGetTypeID(currentValue) == CGColorGetTypeID() { ... }
Другие вопросы по тегам