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

时间:2016-09-09 01:23:46

标签: swift xcode anyobject

我有多个具有相同静态变量的类。我在运行时得到每个类的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(),但它不起作用。所有文件也具有相同的目标成员资格。

1 个答案:

答案 0 :(得分:1)

您应该在TestClass executeFunction方法中使用泛型类型,但我们需要对您的所有三个类ReaderLibrary和{{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