Причиной этой ошибки является конфликт между типом dict
, выведенным компилятором, и типом, который вы упомянули при соответствии Array
вашему protocol
.
Когда вы пишете эту строку
let dict = [["key":"value"]]
Для компилятора это будет так, как показано ниже, где тип равен Array<Dictionary<String, String>>
let dict: Array<Dictionary<String, String>> = [["key":"value"]]
Теперь, когда вы делаете dict.stringValue
, компилятор сначала сопоставляет тип вызывающего объекта, т.е. dict
, с типом, который вы определили во время соответствия Array
с MyProtocol
Поскольку тип компилятора выводит, например, Array<Dictionary<String, String>>
отличается от типа, который вы упомянули в соответствии, т.е., Array<Dictionary<String, Any>>
, поэтому компилятор выдает ошибку.
Но когда вы объявляете переменную dict
с явным типом, т.е. Array<Dictionary<String, Any>>
, таким же, как вы определили для соответствия MyProtocol
, тогда компилятор не видит никаких проблем, и ваш код работает просто отлично.
При соответствии Array/Dictionary
- MyProtocol
вы можете просто игнорировать установку типа Element
, как показано ниже,
extension Array: MyProtocol {
var stringValue: String {
return "ArrayValue"
}
}
extension Dictionary: MyProtocol {
var stringValue: String {
return "DictionaryValue"
}
}