LoginSignup
0
2

More than 3 years have passed since last update.

Extension でのインスタンスの取り扱いに注意する

Posted at

今回は以前書いた下記の記事で、アプリのパフォーマンスをさらにあげるための方法を簡単に紹介したいと思います。

改善方法

整数に3文字区切りのカンマをつけた文字列を返すプロパティを以前は下記のような形で書きました。

extension UInt {
    var withCommaString: String {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        numberFormatter.groupingSeparator = ","
        numberFormatter.groupingSize = 3

        return numberFormatter.string(from: NSNumber(value: self)) ?? "\(self)"
    }
}

仮に、下記のようなメソッドを用意して 10,000 件のデータをコンバートした場合は、同じ NumberFormatter() インスタンス が 10,000 件生成されることになります。特に Formatter はインスタンスを生成するコストは高いのでなるべくインスタンスを使いまわした方がパフォーマンスは向上します。

func getPriceList(source: [UInt]) -> String {
    return source.map { $0.withCommaString }
}

そして修正したコードがこちらになります。static let を用いることで遅延初期化され、呼び出し毎に初期化されることがなくなります。

extension UInt {
    private static let numberFormatter: NumberFormatter = {
        return NumberFormatter()
    }()
    var withCommaString: String {
        UInt.numberFormatter.numberStyle = .decimal
        UInt.numberFormatter.groupingSeparator = ","
        UInt.numberFormatter.groupingSize = 3

        return UInt.numberFormatter.string(from: NSNumber(value: self)) ?? "\(self)"
    }
}

参考

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2