加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 转换为typeof(self)

发布时间:2020-12-14 05:40:47 所属栏目:百科 来源:网络整理
导读:是否可以创建一个类别(扩展名),最终会返回一个被转换为instancetype的对象?我有一个类别来加载SKS文件,但是由于这个类别是针对SKNode的,所以其他所有类别,如SKScene或SKEmitterNode等也将采用它. 所以我只想避免总是从SKNode转换为instancetype.可以将返回
是否可以创建一个类别(扩展名),最终会返回一个被转换为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") {
    // ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读