首页 > 解决方案 > 无法推断 Swift 通用参数“T”

问题描述

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

我的(单例)数据类看起来像:

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
    }
}

但是,当我这样调用我的函数时:

class SomeClass {
     let product: SomeObj = AppData.genericGet(objID) as! SomeObj
}

我得到错误: Generic parameter 'T' could not be inferred

我显式和隐式地将类型转换为我想要的值。不知道我还能做些什么来解决这个问题。

我试过重新启动 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
    }
}

我在以下两行得到错误:

class StoreViewEnvironment: ObservableObject {
    func initProductLoad(storeID: String) {
    ...
        let liveStore: Store = AppData.get(storeID) as! Store
        let liveMenu: Menu = AppData.get(liveStore.menuID) as! Menu
    ... 
   }
}

标签: swiftgenericsdata-structuresxcode11

解决方案


我不赞成你这样做的方式(一般的理由是 Any 总是难闻的气味),但这是一个编译的版本(只需删除Any约束):

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")
}

推荐阅读