Ответ 1
Это может сработать для вас. Я не мог проверить это, потому что у меня мало опыта с 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/OS X 10.10 или более позднюю версию, больше не требуется для пользовательского метода разблокировки. Как отмечено в Нельзя использовать unarchiveFromFile для установки GameScene в SpriteKit, вы можете использовать
convenience init?(fileNamed filename: String)
из суперкласса SKNode
, например
if let e = SKEmitterNode(fileNamed: "Blah") {
// ...
}