https://stackoverflow.com/a/42166899/1979953

https://stackoverflow.com/a/38297423/1979953

を参考に

extension UILabel {
    func replaceAttributedText(string: String) {
        if let originalAttributedText = self.attributedText {
            let attributes = originalAttributedText.attributes(at: 0, effectiveRange: nil)
            self.attributedText = NSAttributedString(string: string, attributes: attributes)
        }
    }
}

を作ってみたのですが、空文字を与えた後で

Terminating app due to uncaught exception 'NSRangeException', reason: 'NSMutableRLEArray objectAtIndex:effectiveRange:: Out of bounds'

になります。

つまり

self.hogeLabel.replaceAttributedText(string: "hoge")
self.hogeLabel.replaceAttributedText(string: "")
self.hogeLabel.replaceAttributedText(string: "aaa") // 空文字を与えてしまった後なのでエラー

このようなコードでエラーが発生します。

空文字を与えたことによってアトリビュート情報が吹っ飛んでしまったせいなのかと推測しているのですが、うまく文字列だけ入れ替える方法はないのでしょうか?

空文字ではなくて、スペースなどの空白文字を入れるとうまくいくのですが、空文字を入れたいです)