たとえば、次の画像のような文字列があった場合、

DB上の文字列も直感的には@はなこさん、こんにちは。
となりそうだが、これでは次の問題がある。
- メンション表示の文字列範囲が正確にわからない
- はなこさんが自分の表示名を変更した場合、その変更に追従できない
そこで、以下のアイデアを取り入れる必要がある。
- 文字列範囲がわからない→メンション該当箇所を独自の表記に置き換える
- プロフィール名変更に追従できない→ユーザーに一意かつ不変の内部IDを使用する
手っ取り早い話、これらを組み合わせるとDB上の文字列は次のようになる。
「#user:4Fj4m2dUw#さん、こんにちは。」
メンション表示を #user:{user_id}#
として内部的に表現することにより、表示箇所が明確になり、かつユーザー変更にも追従可能となる。
あとはメッセージ入力/表示時に、これを正規表現で抽出し、然るべき表示に置き換えれば良い。
#user:{user_id}#
を抽出する正規表現は#user:[^#]*#
なので、例えばメンション表示を文字列@ユーザー名
とする場合を例に取ると、以下のように実装になる。
次回はメンション表示をカーソル操作上1文字扱いするために、NSTextAttachment
を用いて表現する方法について。
実装の全体像はこちら。