Swift 无法推断通用参数 'T'
Swift Generic parameter 'T' could not be inferred
我有一个通用字典,并构建了一个通用函数来访问该字典(以防止并发访问问题)。
我的(单例)数据 class 看起来像:
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")
}
我有一个通用字典,并构建了一个通用函数来访问该字典(以防止并发访问问题)。
我的(单例)数据 class 看起来像:
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")
}