Как я могу проверить тип 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 ответ
Поскольку значение для идентификатора типа может изменяться от выпуска к выпуску, ваш код не должен полагаться на сохраненные или жестко закодированные идентификаторы типа, а также не должен жестко кодировать любые наблюдаемые свойства идентификатора типа (например, такие как маленькое целое число).
Это означает, что вы должны получить идентификатор типа во время выполнения, в вашем случае:
if CFGetTypeID(currentValue) == CGColorGetTypeID() { ... }