繁体   English   中英

Swift无法使用type(of:Instance)访问类中的静态变量

[英]Swift Unable to access static variables in class using type(of: Instance)

我有多个具有相同静态变量的类。 我在运行时获取每个类的currentInstance(AnyObject?)。 然后,我尝试通过使用type(of:instance)方法从实例获取类来访问静态变量。 但是,当尝试获取静态变量时,会引发错误-类型为'AnyObject.Type'的值没有成员。 这是伪代码。

public extension Reader {
  open static var funcDictionary = [String: readerFuncs]() //ReaderFuncs is an enum of functions
}

public extension Library {
  open static var funcDictionary = [String: libraryFuncs]() 
}

public extension ReaderMenu {
  open static var funcDictionary = [String: readerMenuFuncs]() 
}


import Foundation
open class TestClass: NSObject {
  open func executeFunction(currentInstance: AnyObject) { // I get current instance at runtime. And I have checked that I get the correct value
  var count = type(of: currentInstance).functionDictionary.count // Error: Value of type 'AnyObject.Type' has no member funcDictionary 
}

我只想知道在只有该类实例可用时如何访问静态变量。 我也使用过.classforCoder(),但是它不起作用。 所有文件也具有相同的目标成员资格。

您应该在TestClass executeFunction方法中使用泛型类型,但是我们需要对所有三个类ReaderLibraryReaderMenu的通用引用。 为此,我们将创建每个类都必须遵循的协议。

protocol Funcable {

    associatedtype FuncsEnum

    static var funcDictionary: [String:FuncsEnum] { get set }
}

现在,每个类都从Funcable继承,它们都必须具有定义funcDictionary中的枚举类型的类型funcDictionary

class Reader: Funcable {

    typealias FuncsEnum = Reader.Funcs

    static var funcDictionary = [String:FuncsEnum]()

    enum Funcs {
        case A
        case B
    }
}

class Library: Funcable {

    typealias FuncsEnum = Library.Funcs

    static var funcDictionary = [String:FuncsEnum]()

    enum Funcs {
        case C
        case D
    }
}

class ReaderMenu: Funcable {

    typealias FuncsEnum = ReaderMenu.Funcs

    static var funcDictionary = [String:FuncsEnum]()

    enum Funcs {
        case E
        case F
    }
}

您可以根据需要在类之外定义枚举,但为了将其重新使用,我将它们移入了内部。 无论如何回到TestClass,我们都可以使用通用类型令牌T ,它是给定currentInstance类的镜像。

class TestClass: NSObject {

    func executeFunction<T: Funcable>(currentInstance: T) {

        print(T.funcDictionary.count)
    }
}

单独访问枚举,例如Reader.Funcs而不是readerFuncs

更新

我们可以自己实例化currentInstance使其工作。

let testInstance = TestClass()

Reader.funcDictionary.updateValue(.A, forKey: "a")

testInstance.executeFunction(currentInstance: Reader()) // prints 1

Library.funcDictionary.updateValue(.C, forKey: "c")
Library.funcDictionary.updateValue(.D, forKey: "d")

testInstance.executeFunction(currentInstance: Library()) // prints 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM