Можете ли вы применить преобразование типов в протоколе без определения свойства / метода?
Я не хочу определять asString.
protocol ConvertibleToString {var asString: String {get}}
extension Int: ConvertibleToString {
var asString: String {return String(self)}
}
1 ответ
Если я правильно понимаю ваш вопрос - нет, я не думаю, что вы не можете определить "неявное" преобразование, которое обнаруживает и использует соответствующее init
от определенного типа. Единственный способ преобразовать один тип в другой в Swift - это явно вызвать init
для типа "to", который принимает тип "from", или функцию или метод типа "from", который возвращает тип "to". Там нет никакого способа реализации протокола, который говорит "использовать init
для этого типа с другим типом, если таковой имеется ".
Кстати, ваш ConvertibleToString
Протокол по сути является версией Printable
(с asString
на месте description
). Так что, если вы хотите знать, является ли что-то конвертируемым в строку, вы можете просто проверить соответствие Printable
, Хотя обратите внимание, что одна ошибка - String
не является Printable
, Ты можешь использовать toString(thing)
преобразовать что-либо в строку, и он будет использовать Printable
где доступно (и ничего не делать для преобразования строк), хотя у этого есть побочный эффект, заключающийся в предоставлении по умолчанию для непечатаемых типов, которые могут вам не понадобиться в зависимости от ваших потребностей.
Обратите внимание, что вам может потребоваться конвертируемость чего-либо через протокол:
protocol ConvertibleFromInt {
init(Int)
}
extension String: ConvertibleFromInt { }
extension UInt64: ConvertibleFromInt { }
func gimmeFromInt<T: ConvertibleFromInt>(i: Int) -> T {
return T(i)
}
let s: String = gimmeFromInt(5)
let ui: UInt64 = gimmeFromInt(5)