У меня есть быстрый пользовательский CALayer, который имеет несколько динамических свойств (на самом деле @NSManaged
). У меня все правильно настроено и вызывается действие actionForKey.Core animation, self.presentationLayer() is nil
override public func actionForKey(key: String!) -> CAAction! {
switch key {
case "maxCircles", "numCircles":
let animation = CABasicAnimation(keyPath: key)
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear);
animation.fromValue = self.presentationLayer().valueForKey(key);
animation.duration = 0.2
return animation;
default:
return super.actionForKey(key)
}
}
Иногда self.presentationLayer().
бросает исключение, потому что она неявно разворачивают и равна нулю. В Objective-C код обычно просто делает:
[[self presentationLayer] valueForKey:key]
Что не врезаться, но я никогда не понял, что это можно назвать, хотя ноль и генерировать 0 - который чувствует себя очень плохо для меня. Нет никакой гарантии, что я одушевляю ноль.
Каков правильный путь доступа к presentationLayer
в Swift? Должен ли я тестировать нуль? т.е .:
override public func actionForKey(key: String!) -> CAAction! {
if (key == "maxCircles" || key == "numCircles") && self.presentationLayer() != nil {
let animation = CABasicAnimation(keyPath: key)
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear);
animation.fromValue = self.presentationLayer().valueForKey(key);
animation.duration = 0.2
return animation;
}
return super.actionForKey(key)
}
Это решение устраняет проблему, но обратите внимание, что 'presentationLayer()' возвращает неявно разворачиваемую опцию, поэтому пользователям этого метода не нужно проверять значение 'nil'. (Я бы рассмотрел это обходное решение для ошибки Apple API.) То есть, если он * может * быть nil, он должен возвращать 'AnyObject?', А не 'AnyObject!'. –
Решение Мэтта Лонга (и мое) - обходные пути для ошибки Apple. Он не убивает приложения Objective-C, потому что в Objective-C вы можете отправить сообщение «nil», и ничего не происходит, но в Swift это незаконно. –
AnyObject не конвертируется в CALayer, правильный тест: 'if self.presentationLayer() == nil' (добавлено в ответ) –