У меня есть протокол, который имеет функцию, которая может возвращать String или [String: String]. Это мое заявление:
Нет проблем. Давайте это напишем.
enum StringOrDictionary {
case string(String)
case dictionary([String: String])
}
protocol Test {
func returnSomething() -> StringOrDictionary
}
Тогда я хочу реализацию по умолчанию для returnSomething, поэтому я сделал расширение протокола:
хорошо звучит.Я буду считать, что readValueFromPLISTthatCanReturnAStringOrDictionary()
действительно возвращает Any
, так как это то, что возвращается propertyList(from:)
.
extension Test {
func returnSomething() -> StringOrDictionary {
let value = readValueFromPLISTthatCanReturnAStringOrDictionary()
switch value {
case let string as String: return .string(string)
case let dictionary as [String: String]: return .dictionary(dictionary)
default: fatalError() // Or perhaps you'd like to do something else
}
}
}
Это было бы замечательно, чтобы назвать свой тип что-то более значимое, чем StringOrDictionary
, но, кроме того, оно должно быть довольно просто. Просто введите тип, который означает то, что вы говорите. Вам нужен тип, который означает «OR», и это перечисление. (Если вы хотите, типа, который означает «И» это структура BTW.)
Что касается вашего ответа, это не законно:
class RandomClass: Test where Test.T == String {
func getValue() {
let bah = doSomething() // I don't need here to specify bah's type.
}
}
Пути определить ваш T
является реализация требуемый метод.
class RandomClass: Test {
func returnSomething() -> String {
return ""
}
}
Если вы хотите поделиться каким-то распространенным кодом, вы можете прикрепить его как расширение, а не стандартную реализацию. Вы можете написать метод returnString()
и вызвать его из RandomClass.returnSomething(). В некоторых случаях это очень полезно, но я определенно не буду использовать его в этом случае. Вы не имеете в виду «возвращает любой возможный тип (T)». Вы имеете в виду «возвращает один из двух возможных типов», и это перечисление, а не общее.
Обновление: По-видимому, они добавили новую функцию, о которой они говорили, но я думал, что еще нет. Вы могли теперь реализовать RandomClass
таким образом:
class RandomClass: Test {
typealias T = String
}
(Который очень хорошая новая функция, даже если это не хороший ответ на эту проблему.)
Вашей проблемы довольно абстрактно, и я не вполне понимаю. Не могли бы вы рассказать? – Alexander
Реализация по умолчанию всегда используется, если вы не переопределяете ее, поэтому я не уверен, что проблема – Alexander
Я хочу использовать реализацию по умолчанию, но я не могу ее использовать, потому что TestString и TestDictionary не сообщают Протокол испытаний, общий тип которого является T. – Godfather