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或更高版本 convenience init?(fileNamed filename: String) 从SKNode超类,例如 if let e = SKEmitterNode(fileNamed: "Blah") { // ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |