Можете ли вы применить преобразование типов в протоколе без определения свойства / метода?

Я не хочу определять 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 Протокол по сути является версией PrintableasString на месте 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)
Другие вопросы по тегам