覆盖子类Swift中的静态var

Dam*_*ito 5 static overriding var swift

因式分解我的代码,我想设置从儿童类,我会在父类的类FUNC得到stringKey:

Chair.request();
Table.request();

class Furniture: NSObject {

    static let requestKey : String!

    class func request(){

        print("class key => \(self.requestKey)")
        ...
    }
}

class Chair: Furniture {
    static let requestKey : String = "jsonchairs"
} 

class Table: Furniture {
    static let requestKey : String = "tables"
} 
Run Code Online (Sandbox Code Playgroud)

当然,我有预编译的错误消息

属性不会覆盖其超类中的任何属性

有没有解决方案,或者我需要传递密钥作为参数?像这样:

Chair.request(key : "jsonchairs" );
Table.request(key : "tables" );
Run Code Online (Sandbox Code Playgroud)

Rai*_*kas 6

刚遇到同样的问题.使用计算属性 - 可以覆盖这些属性.

基类:

class BaseLanguage {
    class var language: String {
        return "Base"
    }

    static func getLocalized(key: String) -> String {
        print("language: \(language)");
    }
}
Run Code Online (Sandbox Code Playgroud)

儿童班:

class German: BaseLanguage {
    override class var language: String {
        return "de"
    }
}
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因无法使用计算属性,则始终可以将变量属性包装在私有单例中.该类将外部接口公开为静态,但在其内部具有对其实例的静态私有引用.您可以在init方法中更改任何属性的值(只要它是变量).

  • 只需使用“class var”而不是“static var”,即可允许在子类中进行覆盖。 (4认同)

val*_*ale 2

您可以为此使用协议。只需使它们都符合 RequestKeyProtocol 示例,然后在每种情况下实现它即可。

protocol RequestKeyProtocol {
 var requestKey: String
}




 class myClass: RequestKeyProtocol {
   var requestKey = "myKey"
   }
Run Code Online (Sandbox Code Playgroud)

如果您需要默认值,请查看协议扩展。还可以观看今年有关协议的 WWDC 视频。