0

我正在尝试从 DAE 文件中提取动画,如何快速使用此方法?

谢谢,

Objective-C 代码是:

//CAAnimation *animation = [sceneSource entryWithIdentifier:animationIDs[index] withClass:[CAAnimation class]];

func extractAnimationsFromSceneSource(sceneSource: SCNSceneSource) {

    let animationsIDs: NSArray = [sceneSource.isKindOfClass(CAAnimation)]

    let animationCount: Int = animationsIDs.count
    var longAnimations = NSMutableArray(capacity: animationCount)

    let maxDuration: CFTimeInterval = 0

    for index in 0..animationCount {
// gets error CAAnimation is not convertible to 'AnyClass'
        let animation = sceneSource.entryWithIdentifier(animationsIDs[index], withClass:CAAnimation())
    }

}
4

1 回答 1

2

您需要在这里处理几个问题:

  • 的 Swift 等价物[SomeClass class]SomeClass.self.
  • 因为在 ObjC 中entryWithIdentifier返回 an id,所以您通常希望将其转换为适当的 Swift 类型(因为您不能调用方法或访问 an 上的属性AnyObject)。
  • entryWithIdentifiernil如果没有找到条目,则可以在 ObjC 中返回,这意味着它在 Swift 中返回一个可选项。Bridging 使它成为一个隐式展开的可选项,如果您打算将这些动画添加到数组或以其他方式使用它们,这将使您远离崩溃 - 最好自己检查可选项。

此外,您的数组animationIDs看起来很可疑——您正在为一个数组分配一个元素,一个布尔值,它是询问场景源它是什么类的结果。(而且这个布尔值总是false,因为 anSCNSceneSource不是一种CAAnimation。)

因此,您的方法可能如下所示:

func extractAnimationsFromSceneSource(sceneSource: SCNSceneSource) {

    let animationsIDs = source.identifiersOfEntriesWithClass(CAAnimation.self) as String[]
    var animations: CAAnimation[] = []
    for animationID in animationsIDs {
        if let animation = source.entryWithIdentifier(animationID, withClass: CAAnimation.self) as? CAAnimation {
            animations += animation
        }
    }

}

(包括尝试推断您的意图,并在类型推断允许的情况下精简代码。)

于 2014-06-26T17:00:55.763 回答