在Swift 5中用Dictionary(uniqueKeysWithValues :)转换字典键类型

问题描述 投票:2回答:2

[我正在使用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"
    ...
}

错误的外观:

enter image description here

ios swift xcode alamofire swift5
2个回答
2
投票

您最好明确突出显示这样的类型:

extension KeyedParameters {
    var parameters: Parameters {
        return Parameters(uniqueKeysWithValues:
            self.map { (key, value) in (key.rawValue, value) }
        )
    }
}

为我工作。


1
投票

我认为这可能只是错误消息的一种情况。

您的扩展名KeyedParameterstypealias[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) })
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.