是否有可能创建一个最终会返回一个对象的类别(扩展名)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
}
}
Run Code Online (Sandbox Code Playgroud) 我试图允许超类中的方法返回子类的实例,以便我可以使用方法链接与父和子的方法.
但是,当我尝试链接方法时,我收到错误"BaseClass没有名为someOtherChainableMethod的成员".这是我的代码:
class BaseClass {
func someChainableMethod() -> BaseClass {
return self
}
}
class ChildClass: BaseClass {
func someOtherChainableMethod() -> ChildClass {
return self
}
}
let childClass = ChildClass
childClass.someChainableMethod().someOtherChainableMethoid()
Run Code Online (Sandbox Code Playgroud)
问题似乎是父链式方法中的"返回自我"返回一个类型BaseClass而不是类型的实例ChildClass.
我也用泛型尝试了这个并且失败了,这就是我尝试过的:
class BaseClass<T> {
func someChainableMethod() -> T {
return self
}
}
class ChildClass: BaseClass<ChildClass> {
func someOtherChainableMethod() -> ChildClass {
return self
}
}
let childClass = ChildClass
childClass.someChainableMethod().someOtherChainableMethoid()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,BaseClass someChainableMethod方法的错误是"BaseClass不能转换为T".