将@interface UIView 从 Objective-C 翻译成 Swift

Translating @interface UIView from Objective-C to Swift

我正在学习如何使用 UIKit Dynamics 制作菜单动画的 Objective-C 教程,但我在将以下代码从 Objective-C 转换为 Swift 时遇到了一些问题。

animator.h

@interface Animator : NSObject

+ (instancetype)animatorWithScreen:(UIScreen *)screen;

- (void)addAnimation:(id<Animation>)animatable;
- (void)removeAnimation:(id<Animation>)animatable;

@end

@interface UIView (AnimatorAdditions)

- (Animator *)animator;

@end

animator.m

@implementation Animator
{
}

+ (instancetype)animatorWithScreen:(UIScreen *)screen
{
    if (!screen) {      
        screen = [UIScreen mainScreen];
    }
    Animator *driver = objc_getAssociatedObject(screen, &ScreenAnimationDriverKey);
    if (!driver) {
        driver = [[self alloc] initWithScreen:screen];
        objc_setAssociatedObject(screen, &ScreenAnimationDriverKey, driver, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return driver;
}

@implementation UIView (AnimatorAdditions)

- (Animator *)animator
{
    return [Animator animatorWithScreen:self.window.screen];
}

@end

我能够让其他一切正常工作,但我不确定如何让 UIView 使用 Swift 让动画师 属性 以及如何正确翻译:

objc_setAssociatedObject(screen, &ScreenAnimationDriverKey, driver, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

swift 已经有关于 objc_setAssociatedObject 的讨论:"Is there a way to set associated objects in Swift?"

您尝试使用 Animator 进行的操作称为 扩展 。这当然也适用于 swift - 看看 the docs 如何自己创建一个。