【发布时间】:2014-06-13 17:21:01
【问题描述】:
我一直在思考 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
足够合理,我可以传入一个元组,或者同样非客观的 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:...) 的那些类型?
【问题讨论】: