【问题标题】:Singleton and NSNumberFormatter in SwiftSwift 中的 Singleton 和 NSNumberFormatter
【发布时间】:2023-03-03 15:18:01
【问题描述】:

目前,我的一种方法中有以下代码:

let formatter = NSNumberFormatter()
formatter.numberStyle = .DecimalStyle
formatter.currencyGroupingSeparator?
formatter.minimumFractionDigits = 2

因为我必须在不同视图控制器的各种函数中重复这些,我如何在 Swift 中创建一个单例来调用 NSNumberFormatter 并避免重复?

我假设我必须创建一个新的 Swift 文件,但不确定如何构造该类?

【问题讨论】:

  • 你不需要单例。您可以只使用一种类型方法,该方法会出售为事务预先配置的不同类型,然后直接使用它们。

标签: ios swift singleton nsnumberformatter


【解决方案1】:

更新:Xcode 8.2.1 • Swift 3.0.2

extension Double {
    static let twoFractionDigits: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.minimumFractionDigits = 2
        formatter.maximumFractionDigits = 2
        return formatter
    }()
    var formatted: String {
        return Double.twoFractionDigits.string(for: self) ?? ""
    }
}

100.954345.formatted    // 100.95

【讨论】:

  • XY 问题示例。 OP问“我如何创建一个单身人士”。实际上,他想知道“如何用很少的代码有效地格式化 Double”,这完美地回答了它。
【解决方案2】:

好的,我要做的是创建一个延迟实例化的属性。这样一来,您将没有重复项,并且在您需要之前不会创建它并占用内存。

lazy var numberFormatter = [NSNumberFormatter] = {
    var _numberFormatter = [NSNumberFormatter]()
    _numberFormatter.numberStyle = .DecimalStyle
    _numberFormatter.currencyGroupingSeparator?
    _numberFormatter.minimumFractionDigits = 2
    return _numberFormatter
}()

【讨论】:

  • 感谢您对我的问题的回答和编辑。这行得通,但为什么不是扩展,因为我必须在其他 ViewControllers 中引用它?
  • 我以为你会继承这个 VC 的子类。如果你愿意,你可以将它与扩展配对。
【解决方案3】:

NSNumberFormatter 并不昂贵(与NSDateFormatter 相比),但如果你想要一个类方法,它只出售一次实例化的对象

class var prettyFormatter:NSNumberFormatter {

        struct SingletonNumberFormatter {
            static var instance:NSNumberFormatter?
        }

        if SingletonNumberFormatter.instance == nil {
            SingletonNumberFormatter.instance = NSNumberFormatter()
            SingletonNumberFormatter.instance.numberStyle = .DecimalStyle
            SingletonNumberFormatter.instance.currencyGroupingSeparator?
            SingletonNumberFormatter.instance.minimumFractionDigits = 2
        }

        return SingletonNumberFormatter.instance!
 }

【讨论】:

    【解决方案4】:

    另一个单例解决方案:

    class Formatters{
        static let twoFractionDigits: NumberFormatter = {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            formatter.minimumFractionDigits = 2
            formatter.maximumFractionDigits = 2
            return formatter
        }()
        static func formatNumber(fromNumber: NSNumber) -> String{
            return twoFractionDigits.string(from: fromNumber) ?? ""
        }
    }
    

    用法:

    Formatters.formatNumber(fromNumber: 100)
    

    当您有一个类型为 Int、CGFloat 等的变量时,请使用:

    Formatters.formatNumber(fromNumber: 100 as NSNumber)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多