swift - 无法推断 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
...
}
}
解决方案
我不赞成你这样做的方式(一般的理由是 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")
}
推荐阅读
- excel - 使用类/标签名称提取数据并限制结果
- python - 如何在python中选择声音设备
- ruby-on-rails - 评论文章应用程序中 Ruby on Rails 中模型的未定义方法
- typescript - 理解 Typescript 中的嵌套尖括号
- python - PyKinectv2 身体跟踪计数
- objective-c - 如何在 iOS 上将 minLength 属性添加到 React Native TextInput?
- python - bash:Visual Studio Code 中意外标记“&”附近的语法错误
- reactjs - 将 State 初始化为 Props 会创建一个链接
- javascript - 如何访问我正在工作的当前目录之外的 user._id 对象?
- java - java android androidx.multidex.MultiDexApplication 无法转换为 android.app.Activity 错误