swift – 转换为typeof(self)

前端之家收集整理的这篇文章主要介绍了swift – 转换为typeof(self)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否可以创建一个类别(扩展名),最终会返回一个被转换为instancetype的对象?我有一个类别来加载SKS文件,但是由于这个类别是针对SKNode的,所以其他所有类别,如SKScene或SKEmitterNode等也将采用它.

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

我想我可以使用 – >自己作为返回类型,但我不知道如何投放场景到instancetype,所以这个东西将编译..

例如:

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

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
    }
}
这可能适合你.我无法测试,因为我没有太多经验
SpriteKit.但它确实编译和编译器推断的类型
let e = SKEmitterNode.unarchiveFromFile("Blah")

是SKEmitterNode.这个想法是定义一个通用的帮助函数

func unarchiveFromFileHelper<T where T : SKNode>(file: String) -> T

以便

class func unarchiveFromFile(file: String) -> Self {
    // define helper function ...
    return unarchiveFromFileHelper(file)
}

用T == Self调用帮助函数.

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,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 / OS X 10.10或更高版本
不再需要一个自定义的unarchive方法了.如前所述
Cannot use unarchiveFromFile to set GameScene in SpriteKit,可以使用

convenience init?(fileNamed filename: String)

从SKNode超类,例如

if let e = SKEmitterNode(fileNamed: "Blah") {
    // ...
}
原文链接:https://www.f2er.com/swift/318742.html

猜你在找的Swift相关文章