发布
社区首页 >问答首页 >转换成(自我)类型

转换成(自我)类型
EN

Stack Overflow用户
提问于 2014-08-12 18:08:29
回答 1查看 2.7K关注 0票数 12

是否有可能创建一个类别(扩展),最终返回一个抛给instancetype的对象?我有一个类别来加载SKS文件,但是由于这个类别是用于SKNode的,所以所有其他子类,如SKSceneSKEmitterNode,等等。也会接受的。

因此,我只想避免总是从SKNode转换到instancetype。是否可以将返回类型更改为instancetype,并确保编译器对返回值满意?

我想我可以使用-> Self作为返回类型,但是我不知道如何将scene转换为instancetype,这样就可以编译..。

例如:

SKEmitterNode.unarchiveFromFile("Blah")将返回SKEmitterNode的一个实例

代码语言:javascript
代码运行次数:0
复制
extension SKNode {
    class func unarchiveFromFile(file: String) -> SKNode {
        let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks")
        var sceneData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil)

        let unarchiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
        unarchiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")

        let scene = unarchiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKNode
        unarchiver.finishDecoding()

        return scene
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-12 19:30:19

这可能对你有用。我无法测试它,因为我对SpriteKit没有太多的经验。但是它确实编译和编译器推断类型为

代码语言:javascript
代码运行次数:0
复制
let e = SKEmitterNode.unarchiveFromFile("Blah")

是SKEmitterNode。其思想是定义一个泛型助手函数。

代码语言:javascript
代码运行次数:0
复制
func unarchiveFromFileHelper<T where T : SKNode>(file: String) -> T 

所以

代码语言:javascript
代码运行次数:0
复制
class func unarchiveFromFile(file: String) -> Self {
    // define helper function ...
    return unarchiveFromFileHelper(file)
}

T == Self调用助手函数。

代码语言:javascript
代码运行次数:0
复制
extension SKNode {
    class func unarchiveFromFile(file: String) -> Self {

        func unarchiveFromFileHelper<T where T : SKNode>(file: String) -> T {
            let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks")
            var sceneData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil)

            let unarchiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
            unarchiver.setClass(T.classForKeyedUnarchiver(), forClassName: "SKScene")

            let scene = unarchiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as T
            unarchiver.finishDecoding()
            return scene
        }

        return unarchiveFromFileHelper(file)
    }
}

更新:如果您的目标是iOS 8/OSX10.10或更高版本,那么就不再需要定制的解压缩方法了。正如在Cannot use unarchiveFromFile to set GameScene in SpriteKit中所指出的,您可以使用

代码语言:javascript
代码运行次数:0
复制
convenience init?(fileNamed filename: String)

来自SKNode超类,例如。

代码语言:javascript
代码运行次数:0
复制
if let e = SKEmitterNode(fileNamed: "Blah") {
    // ...
}
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25271208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档