SceneKit – 将 Objective-C 块转换为 Swift

SceneKit – Converting Objective-C block to Swift

有没有 Swift 大师知道如何将 Objective-c 中的代码转换为 Swift?

SCNAnimationEventBlock chainEventBlock = ^(CAAnimation *animation, id animatedObject, BOOL playingBackward) {
        [self.mainSkeleton addAnimation:secondAnim forKey:secondKey];
};

if (firstAnim.animationEvents == nil || firstAnim.animationEvents.count == 0) {
    firstAnim.animationEvents = @[[SCNAnimationEvent animationEventWithKeyTime:fadeTime block:chainEventBlock]];
} else {
    NSMutableArray *pastEvents = [NSMutableArray arrayWithArray:firstAnim.animationEvents];
    [pastEvents addObject:[SCNAnimationEvent animationEventWithKeyTime:fadeTime block:chainEventBlock]];
    firstAnim.animationEvents = pastEvents;
}

在Swift中,我试过:

var chainEventBlock : ((CAAnimation , AnyObject , Bool) -> (SCNAnimationEventBlock))?
chainEventBlock = { (animation, animatedObject, playingBackward)->(SCNAnimationEventBlock) in
    return self.mainSkeleton?.addAnimation(anim2, forKey: secondKey)
}

if anim1?.animationEvents == nil || anim1?.animationEvents.count == 0 {
    anim1?.animationEvents = [SCNAnimationEvent(keyTime: fadeTime, block: chainEventBlock)]
}

错误是:

谢谢。

您已将块的 return 类型声明为 SCNAnimationEventBlock 但您没有 return 那。

return 一个该类型的对象(不是可选的!),或者 return 什么都不做,并更改 chainEventBlock.

的声明
let chainEventBlock: SCNAnimationEventBlock = { animation, animatedObject, playingBackwards in
    self.mainSkeleton?.addAnimation(anim2, forKey: secondKey)
    return
}

if anim1?.animationEvents == nil || anim1?.animationEvents.count == 0 {
    anim1?.animationEvents = [SCNAnimationEvent(keyTime: fadeTime, block: chainEventBlock)]
}