Swift通用参数';T';无法推断

Swift通用参数';T';无法推断,swift,generics,data-structures,xcode11,Swift,Generics,Data Structures,Xcode11,我有一个通用字典,并构建了一个访问该字典的通用函数(以防止并发访问问题) 我的(单例)数据类如下所示: class AppData { static let genericDict: Dictionary<String, Any> = [:] static func genericGet<T: Any>(_ objID: String) -> T { let retVal: T mySemaphore.wai

我有一个通用字典,并构建了一个访问该字典的通用函数(以防止并发访问问题)

我的(单例)数据类如下所示:

class AppData {
    static let genericDict: Dictionary<String, Any> = [:]
    
    static func genericGet<T: Any>(_ objID: String) -> T {
        let retVal: T
        mySemaphore.wait()
        retVal = genericDict[objID] as! T
        mySemaphore.signal()
        return retVal
    }
}
我得到一个错误:
无法推断泛型参数“T”

我显式和隐式地将类型强制转换为所需的值。不确定我还能做些什么来解决这个问题

我已尝试重新启动XCode,但没有帮助

真正的代码:

public class AppData: ObservableObject {
    static private var dataDirectory: Dictionary<String, Any> = Dictionary(minimumCapacity: 10000)
    
    static let dataGetLock = DispatchSemaphore(value: 1)
    static func get<T: Any>(_ objID: String) -> T? {
        let retVal: T
        dataGetLock.wait()
        retVal = dataDirectory[objID] as! T
        dataGetLock.signal()
        return retVal
    }
}

我不赞成你这样做(一般来说,任何东西都是一种难闻的气味),但这里有一个编译版本(只需删除
Any
约束):

类AppData{
静态let genericDict:Dictionary=[:]
静态函数get(ujid:String)->T{
让我们回顾一下:T
retVal=genericDict[objID]as!T
返回返回
}
}
上课{
让product:String=AppData.get(“yoho”)
}

这是你的真实代码吗?如果是这样,那就没有意义了;你说的是
AppData.genericGet
,但是
genericGet
不是一个静态函数。类似地,您正在调用
genericDict
,这是一个静态常量,从不是静态函数的
genericGet
中调用。所有这些都是不可能的。请在问题中复制并粘贴真实代码;不要试图在问题中键入或编造代码。-还有,什么是mySemaphore?不要显示依赖于您未显示的代码的代码。显然,这是一个打字错误,显然这不是真正的代码。我可以在下面发布我的真实代码,但我担心辅助数据结构会使实际问题更加不透明。我将在下面添加真正的代码。
mySemaphore
是一个通用信号量,以防它在某种程度上增加了我所不知道的复杂性。感谢您的回答–但是这个修复程序将破坏使用泛型的大部分理由。我使用
字典
将数据存储在一个地方,而不管数据类型如何。此外,正如我在问题中所说,AppData是一个单例(您不能为不同的类型创建不同的数据)。最初,我只是直接给字典打电话。然而,这产生了线程并发问题。因此使用了显式get函数。好的,我明白了,我将完全更改我的答案。:)好的,编辑完毕。基本上,任何泛型约束都是错误的。Type:T.Type的
的实现修复了这个问题。我不知道答案是什么。这似乎是一个细微的修正,为什么会起作用?我的代码怎么了?你可以用任何一种方法。但是在任何情况下,
:任何
都需要删除。在我现在的代码中,
product:String
声明消除了类型的歧义;如果您想通过该类型,也可以。:)
public class AppData: ObservableObject {
    static private var dataDirectory: Dictionary<String, Any> = Dictionary(minimumCapacity: 10000)
    
    static let dataGetLock = DispatchSemaphore(value: 1)
    static func get<T: Any>(_ objID: String) -> T? {
        let retVal: T
        dataGetLock.wait()
        retVal = dataDirectory[objID] as! T
        dataGetLock.signal()
        return retVal
    }
}
class StoreViewEnvironment: ObservableObject {
    func initProductLoad(storeID: String) {
    ...
        let liveStore: Store = AppData.get(storeID) as! Store
        let liveMenu: Menu = AppData.get(liveStore.menuID) as! Menu
    ... 
   }
}
class AppData {
    static let genericDict: Dictionary<String, Any> = [:]
    
    static func get<T>(_ objID: String) -> T {
        let retVal: T
        retVal = genericDict[objID] as! T
        return retVal
    }
}

class SomeClass {
    let product : String = AppData.get("yoho")
}