是否可以创建一个类别(扩展名),最终会返回一个被转换为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.但它确实编译和编译器推断的类型
原文链接:https://www.f2er.com/swift/318742.htmlSpriteKit.但它确实编译和编译器推断的类型
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) }
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") { // ... }