2016-07-07 8 views
2

Итак, что это такое, есть filed bug for swift, относящийся к типам CoreFoundation. Основываясь на описании, похоже, что для CGPath и CGColor нет проверки типов, ниже - фрагмент из ошибки, которая демонстрирует поведение.Как я могу ввести проверку CGColor/CGPath?

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 Documentation говорит, что 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)) 
     } 
    } 

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

+1

Я не знаком с этой проблемой, но вместо сравнения с жесткой кодировкой константы '269 'вы можете сравнить с' CGColorGetTypeID() '. –

+0

@MartinR удивительно, это именно то, что я искал !! Я не хотел жестко кодировать это значение, если оно изменилось :) – AntonTheDev

ответ

3

Apple writes:

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

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

if CFGetTypeID(currentValue) == CGColorGetTypeID() { ... } 
Смежные вопросы