所以我想为NSNumber,Int,Double和Float添加一个通用扩展,其中值被转换为格式化的String。
我首先创建了一个自定义协议:
protocol MyFormatConvertible {
var toMyFormat: String { get }
}
extension NSNumber: MyFormatConvertible {}
extension Double: MyFormatConvertible {}
extension Float: MyFormatConvertible {}
extension Int: MyFormatConvertible {}
现在我正在尝试将格式添加到扩展程序:
extension MyFormatConvertible {
public var toMyFormat: String {
let numberValue = NSNumber(value:self)
....
但这似乎不起作用,因为我收到错误:
无法使用参数列表调用类型为“NSNumber”的初始值设定项 输入'(值:自我)'
有关如何解决此问题的任何提示?
答案 0 :(得分:2)
您只需使用protocol MyFormatConvertible {
var toMyFormat: String { get }
}
extension MyFormatConvertible {
var toMyFormat: String {
return String(describing: self)
}
}
extension NSNumber: MyFormatConvertible {}
extension Double: MyFormatConvertible {}
extension Float: MyFormatConvertible {}
extension Int: MyFormatConvertible {}
print(1.toMyFormat)
print(1.2.toMyFormat)
print(1.234.toMyFormat)
print(NSNumber(value: 1.23456).toMyFormat)
即可实现。
Vue.prototype.$apiurl = '127.0.0.1:8000/api'
答案 1 :(得分:2)
NSNumber(value:)
有各种各样的重载
数字类型,但没有通用的NSNumber(value:)
构造函数。
可能的解决方法是使用
func string(for obj: Any?) -> String?
Formatter
的“抽象”超类NumberFormatter
的函数,它接受任何类型的参数(但可能会返回nil
):
protocol MyFormatConvertible {
var toMyFormat: String { get }
}
extension MyFormatConvertible {
var toMyFormat: String {
let formatter = NumberFormatter()
formatter.numberStyle = .spellOut // <-- Just for demonstration purposes!!
return formatter.string(for: self) ?? "\(self)"
}
}
extension NSNumber: MyFormatConvertible {}
extension Double: MyFormatConvertible {}
extension Float: MyFormatConvertible {}
extension Int: MyFormatConvertible {}
print(123.toMyFormat) // one hundred twenty-three
print(Float.pi.toMyFormat) // three point one four one five nine two five zero two five nine three nine nine