Stringのcharacters.countが非推奨(deprecated)になって、文字列の長さを取得する実装について

はじめに

characters.countと実際に人が見てカウントできる数を取得していたのですが、
(正確にできるようになったのはどうもSwift4.0.0以降?)
Qiita Swift の文字列の長さ yamoridon様の記事
Xcode9.1以降ではStringのcharactersプロパティが非推奨になっていました。

screen.png

サンプル

しかし、Swift4.0.0以降でcountプロパティが強力になったようで、これを使うと良いのかもしれません。例を示します。

今までのcharacters.countと同じ値を出すものを探してみました。

let text = "ABCDEFG"
print(text.utf8.count)              // 7
print(text.utf16.count)             // 7
print((text as NSString).length)    // 7
print(text.utf8CString.count)       // 8
print(text.unicodeScalars.count)    // 7
print(text.count)                   // 7 
print(text.characters.count)        // 7  deprecated
print(text.underestimatedCount)     // 7

//////////////////////////////////////////////////////////

let text = "ABC😄DEF"
print(text.utf8.count)              // 10
print(text.utf16.count)             // 8
print((text as NSString).length)    // 8
print(text.utf8CString.count)       // 11
print(text.unicodeScalars.count)    // 7
print(text.count)                   // 7 
print(text.characters.count)        // 7  deprecated
print(text.underestimatedCount)     // 7

//////////////////////////////////////////////////////////

let text = "ABC👩‍👩‍👧‍👦DEF"
print(text.utf8.count)              // 31
print(text.utf16.count)             // 17
print((text as NSString).length)    // 17
print(text.utf8CString.count)       // 32
print(text.unicodeScalars.count)    // 13
print(text.count)                   // 7 
print(text.characters.count)        // 7  deprecated
print(text.underestimatedCount)     // 7

ちなみに、UITextViewなどに入っている文字(NSMutableAttributedStringなど)に対して色をつけるなどのNSRangeを決定する際は見た目のカウント数で取得してはうまく行かなかったりします。


以下string.count

no.png


以下string.utf16.count((text as NSString).lengthと同じ)

ok.png


以下NSMutableAttributedStringのlengthプロパティ

okok.png

文字に色をつけるなどをする場合は1番下のNSMutableAttributedStringのlengthプロパティが良いのかもしれません。

NSRangeなどの範囲決定に利用するNSMutableAttributedStringのlengthは自動で利用する文字コードに対応されるのかなという疑問が残りました。(文字コードの詳しい詳細については理解できなかったです...)

参考にさせていただいた記事

見て頂いてありがとうございます。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.