8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Swift 惰性静态成员初始化

Jack Ecuyer 2月前

30 0

从此代码开始:class Formatters { static let shared = Formatters() var humaneNumbers: NumberFormatter; private init() { humaneNumbers = NumberFormatter() ...

从此代码开始:

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。

我遗漏了什么吗?

帖子版权声明 1、本帖标题:Swift 惰性静态成员初始化
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Jack Ecuyer在本站《date》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 您可以评估闭包来封装配置。

    class Formatters {
        static let humaneNumbers: NumberFormatter = {
            let humaneNumbers = NumberFormatter()
            humaneNumbers.numberStyle = .decimal
            return humaneNumbers
        }()
    }
    
  • 澄清一下发生了什么:这只是一个存储属性,其值像其他任何属性一样被初始化。它恰好是对包含其他逻辑的闭包进行求值的结果,但这只是一个细节。关键细节是 OP 的尝试是使用计算属性,而该属性从未保留结果。

  • 请注意,仍然可以修改 humaneNumbers 格式化程序的属性。Formatters.humaneNumbers.numberStyle = .currency

  • Formatters 不是一种现代方法。静态计算属性是 现在的做事方式 ,但它们不会创建 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)
    
  • 这可能是我实际问题的答案,但不是直接回答我的问题,因为我不理解静态成员闭包。所以必须投赞成票。:)

返回
作者最近主题: