Я хотел бы создать функцию, которая возвращает объект, соответствующий протоколу, но протокол использует 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
Хорошо, теперь я застрял. Кто-нибудь, пожалуйста, помогите заполнить пробелы в моем понимании типов и дженериков, возможно, указывая на полезные ресурсы?