Я размышлял о возможных реализациях форматирования строк для swift, большинство из которых сводилось к "использованию NSString (format:...)". Это хорошо и хорошо, но мне нужен сжатый и читаемый формат, поэтому Я решил реализовать что-то вроде оператора форматирования python%:
@infix func % (value:Double, format:String) -> String {
return NSString(format:format, value)
}
Это отлично работает для Double, поскольку я могу использовать:
println("PI = " + M_PI % "%.3f")
что приводит к:
PI = 3.142
Пока я могу создать 5 из них тривиально, я хотел бы превратить его в общую функцию:
@infix func %<T> (value:T, format:String) -> String {
return NSString(format:format, value)
}
Но это приводит к сообщению:
Could not find an overload for 'init' that accepts the supplied arguments
Достаточно разумный, я мог бы проходить в кортеже, или что-то в равной степени не objective-C. (Обратите внимание, что для действительно этого стиля Python я хочу передать в кортеж, но это другое дело и выходит за рамки этого вопроса)
Я попытался объявить свой собственный пустой протокол и реализовать его в Double, но это не помогло.
protocol NSStringFormattable {}
extension Double : NSStringFormattable {}
@infix func % <T:NSStringFormattable> (value:T, format:String) -> String {
return NSString(format:format, value)
}
Я мог бы сделать что-то вроде добавления функции формата для каждого класса, а затем просто определить оператор в терминах функции формата, но во многих отношениях это не лучше, чем просто определение 5 различных перегрузок операторов.
protocol NSStringFormattable {
func format(format:String) -> String
}
extension Double : NSStringFormattable {
func format(format:String) -> String {
return NSString(format:format, self)
}
}
@infix func % <T:NSStringFormattable> (value:T, format:String) -> String {
return value.format(format)
}
Как ограничить T только теми типами, которые можно передать на NSString(format:...)
?