我有多个具有相同静态变量的类。我在运行时得到每个类的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(),但它不起作用。所有文件也具有相同的目标成员资格。
答案 0 :(得分:1)
您应该在TestClass
executeFunction
方法中使用泛型类型,但我们需要对您的所有三个类Reader
,Library
和{{1}进行通用引用}。为此,我们将创建一个每个类必须符合的协议。
ReaderMenu
现在每个类都继承自protocol Funcable {
associatedtype FuncsEnum
static var funcDictionary: [String:FuncsEnum] { get set }
}
,它们都需要有一个定义Funcable
中枚举类型的类型。
funcDictionary
如果您愿意,可以在类之外定义您的枚举,但我已将它们移到内部以使其更具可重用性。无论如何回到TestClass,我们可以使用Generic Type Token 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
}
}
,它是给定T
的类的镜像。
currentInstance
要单独访问枚举,例如class TestClass: NSObject {
func executeFunction<T: Funcable>(currentInstance: T) {
print(T.funcDictionary.count)
}
}
代替Reader.Funcs
更新
我们可以自己实例化readerFuncs
以使其正常工作。
currentInstance