Swift惰性静态成员初始化

xxe27gdn  于 2023-03-28  发布在  Swift
关注(0)|答案(2)|浏览(212)

从这段代码开始:

class Formatters {
    static let shared = Formatters()
    
    var humaneNumbers: NumberFormatter;
    
    private init() {
        humaneNumbers = NumberFormatter()
        humaneNumbers.numberStyle = .decimal
    }
}

(此处不包括线程安全。)
我需要将其称为Formatters.shared.humaneNumbers;我宁愿直接调用Formatters.humaneNumbers
有没有一种方法可以只使用静态属性来实现这一点?我尝试了这个方法:

class Formatters {
    static var humaneNumbers: NumberFormatter {
        let humaneNumbers = NumberFormatter()
        humaneNumbers.numberStyle = .decimal
        return humaneNumbers
    }
}

...但它变成了一个静态计算属性,因此每次都调用它,而不是只调用一次。
当然,还有这样一种方法:

class Formatters {
    static let humaneNumbers = NumberFormatter()
}

但这给了我一个非定制的NumberFormatter。
我错过什么了吗?

z9ju0rcb

z9ju0rcb1#

您可以计算闭包来封装配置。

class Formatters {
    static let humaneNumbers: NumberFormatter = {
        let humaneNumbers = NumberFormatter()
        humaneNumbers.numberStyle = .decimal
        return humaneNumbers
    }()
}
7d7tgy0s

7d7tgy0s2#

Formatters类不是一种现代的方法,静态计算属性是how things are done now,但它们不创建Formatter对象。
您的humane样式实际上是默认样式。

extension FormatStyle where Self == FloatingPointFormatStyle<Double> {
  static var humane: Self { number }
  static var inhumane: Self { number.sign(strategy: .never) }
}
// All three are "1,234.56"
1234.56.formatted()
1234.56.formatted(.humane)
(-1234.56).formatted(.inhumane)

相关问题