Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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は自動で利用する文字コードに対応されるのかなという疑問が残りました。(文字コードの詳しい詳細については理解できなかったです...)

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

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away