相关疑难解决方法(0)

转换为typeof(self)

是否有可能创建一个最终会返回一个对象的类别(扩展名)instancetype?我有一个类别来加载SKS文件,但由于这个类别适用于SKNode所有其他子类,如SKSceneSKEmitterNode等...也将采用它.

所以,我只是想避免总是从铸造SKNodeinstancetype.是否可以将返回类型更改为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)

swift

11
推荐指数
1
解决办法
2423
查看次数

从swift中的基类返回子类

我试图允许超类中的方法返回子类的实例,以便我可以使用方法链接与父和子的方法.

但是,当我尝试链接方法时,我收到错误"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".

inheritance swift

10
推荐指数
1
解决办法
2921
查看次数

标签 统计

swift ×2

inheritance ×1