是否有可能创建一个类别(扩展),最终返回一个抛给instancetype
的对象?我有一个类别来加载SKS文件,但是由于这个类别是用于SKNode
的,所以所有其他子类,如SKScene
或SKEmitterNode
,等等。也会接受的。
因此,我只想避免总是从SKNode
转换到instancetype
。是否可以将返回类型更改为instancetype
,并确保编译器对返回值满意?
我想我可以使用-> Self
作为返回类型,但是我不知道如何将scene
转换为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
}
}
发布于 2014-08-12 19:30:19
这可能对你有用。我无法测试它,因为我对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, 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中所指出的,您可以使用
convenience init?(fileNamed filename: String)
来自SKNode
超类,例如。
if let e = SKEmitterNode(fileNamed: "Blah") {
// ...
}
https://stackoverflow.com/questions/25271208
复制相似问题