gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 16:12:18 24 4
gpt4 key购买 nike

我有多个具有相同静态变量的类。我在运行时获取每个类的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com