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

标签 swift xcode anyobject

我有多个具有相同静态变量的类。我在运行时获取每个类的 currentInstance(AnyObject?)。然后我试图通过使用 type(of: instance) 方法从实例中获取一个类来访问静态变量。但是当试图获取静态变量时,它会抛出一个错误 - Value of type 'AnyObject.Type' has no member 。这是伪代码。

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)。

protocol Funcable {

    associatedtype FuncsEnum

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

现在每个类都继承自Funcable,它们都需要有一个类型别名来定义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

关于Swift 无法使用类型访问类中的静态变量(: Instance),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39402456/

相关文章:

ios - 将自定义模块添加到 Podspec 中的 Target build设置

ios - 如何将 Unity 集成到 native iOS 应用程序中?

ios - 如何从 AnyObject 转换 UserDefault 值?到一个 Int 这样我就可以保存它

Swift AnyObject 的下标,从哪里来的?

swift - 枚举关联值的问题

Swift - 如何使用类类型作为参数/变量

ios - 如何使用按钮打开 View

ios - 如何使用 NSExtensionPrincipalClass 显示 Storyboard UI 进行共享扩展

xcode - 为什么 Xcode 缓存如此庞大?

ios - 找不到架构 arm64 的 IOSurface 框架