[我正在使用Alamofire 5编写具有iOS 13.4(Swift 5,Xcode 11)联网功能的应用程序。我已经创建了自定义类型typealias KeyedParameters = [ParameterKeys: Any]
,以便能够以“快捷”的方式使用我的API参数键(即.login
而不是KeyedParameters.login.rawValue
)。
问题是,当我尝试将此类型转换回默认的Alamofire的Parameters
时,出现以下错误:Cannot convert return expression of type 'Dictionary<ParameterKeys, Any>' to return type 'Parameters' (aka 'Dictionary<String, Any>')
。
铸造:
extension KeyedParameters {
var parameters: Parameters {
Dictionary(uniqueKeysWithValues: map { ($0.key.rawValue, $0.value) })
}
}
ParameterKeys:
enum ParameterKeys: String {
// MARK: - Auth and User
case id, login, password, email, name
case createdAt = "created_at"
...
}
错误的外观:
您最好明确突出显示这样的类型:
extension KeyedParameters {
var parameters: Parameters {
return Parameters(uniqueKeysWithValues:
self.map { (key, value) in (key.rawValue, value) }
)
}
}
为我工作。
我认为这可能只是错误消息的一种情况。
您的扩展名KeyedParameters
(typealias
的[ParameterKeys: Any]
实际上等于:]
extension Dictionary where Key == ParameterKeys, Value: Any { ...
在该类型本身的声明内为泛型类型调用初始化器时,Swift具有某些奇怪的行为。如果通用类型不同,它将无法正确处理。
这是一个简单的示例,没有太多的红色鲱鱼(类型别名,枚举原始值等)和依赖项:
extension Dictionary {
func returnADifferentDict() -> [Character: String] {
let words = [
"apple", "anchovies",
"bacon", "beer",
"celery"
]
return Dictionary(uniqueKeysWithValues:
words.map { ($0.first!, $0) }
)
// fixed:
// return Dictionary<Character, String>(uniqueKeysWithValues:
// words.map { ($0.first!, $0) }
// )
}
}
解决方案是显式指定要初始化的泛型类型的泛型类型参数。就您而言,
extension KeyedParameters {
var parameters: Parameters {
Dictionary<String, Any>(uniqueKeysWithValues: map { ($0.key.rawValue, $0.value) })
}
}