[英]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
方法中使用泛型类型,但是我们需要对所有三个类Reader
, Library
和ReaderMenu
的通用引用。 为此,我们将创建每个类都必须遵循的协议。
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.