Я хотел бы создать функцию, которая возвращает объект, соответствующий протоколу, но протокол использует typealias
. Учитывая следующий пример игрушки:
protocol HasAwesomeness {
typealias ReturnType
func hasAwesomeness() -> ReturnType
}
extension String: HasAwesomeness {
func hasAwesomeness() -> String {
return "Sure Does!"
}
}
extension Int: HasAwesomeness {
func hasAwesomeness() -> Bool {
return false
}
}
String
и Int
были расширены, чтобы соответствовать HasAwesomeness
, и каждый из них реализует метод hasAwesomeness()
для возврата другого типа.
Теперь я хотел бы создать класс, который возвращает объект, который соответствует протоколу HasAwesomeness
. Мне все равно, что такое класс, просто я могу отправить сообщение hasAwesomenss()
. Когда я пытаюсь выполнить следующее, я генерирую ошибку компиляции:
class AmazingClass: NSObject {
func returnsSomethingWithAwesomeness(key: String) -> HasAwesomeness {
...
}
}
ОШИБКА: Протокол "HasAwesomeness" может использоваться только в качестве общего ограничения, поскольку он имеет собственные или связанные требования типа
Как вы можете себе представить, целью returnsSomethingWithAwesomeness
является возвращение a String
или Int
на основе параметра key
. Ошибка, которую компилятор выбрасывает sorta-sorta, имеет смысл, почему она запрещена, но она дает представление об исправлении синтаксиса.
func returnsSomethingWithAwesomeness<T: HasAwesomeness>(key: String) -> T
{
...
}
Хорошо, мое чтение - это метод returnsSomethingWithAwesomeness
- это общий метод, который возвращает любой тип T
, который имеет подтип HasAwesomness
. Но в следующей реализации возникают больше ошибок типа компиляции:
func returnsSomethingWithAwesomeness<T: HasAwesomeness>(key: String) -> T
{
if key == "foo" {
return "Amazing Foo"
}
else {
return 42
}
}
ОШИБКА: Тип 'T' не соответствует протоколу 'StringLiteralConvertible'
ОШИБКА: Тип 'T' не соответствует протоколу IntegerLiteralConvertible
Хорошо, теперь я застрял. Кто-нибудь, пожалуйста, помогите заполнить пробелы в моем понимании типов и дженериков, возможно, указывая на полезные ресурсы?