文字列の長さを取得する


781

どのようにしてaの長さを取得しますStringか?たとえば、次のように定義された変数があります。

var test1: String = "Scott"

ただし、文字列に長さのメソッドが見つからないようです。



Swift 3のため、多くのコードを手動で移行する必要があったため、拡張機能を作成することにしました。したがって、新しいメジャーリリースにアップグレードする必要がある場合は、拡張機能のみを移行する必要があります。ここで、私が作成したSwift 3拡張機能を見つけることができます。github.com/tukur187/Swift3
Shkelzen

回答:


1284

Swift 4以降

それはただ:

test1.count

理由があります。

(Martin Rに感謝)

Swift 2以降:

Swift 2では、Appleはグローバル機能をプロトコル拡張に変更しました。プロトコル拡張は、プロトコルに準拠するあらゆるタイプに一致する拡張です。したがって、新しい構文は次のとおりです。

test1.characters.count

(ヘッドアップしてくれたJohnDifoolに感謝)

Swift 1以降

文字カウント方法を使用します。

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"

Apple Swiftガイドから直接

(注意:1.2より前のバージョンのSwiftの場合、これはcountElements(unusualMenagerie)代わりになります)

あなたの変数では、それは

length = count(test1) // was countElements in earlier versions of Swift

または、test1.utf16countを使用できます


11
countElementsがグローバル関数であることは興味深いことです。グローバル関数のリストはありますか?
スコットウォルター

7
countElementsの問題は、それが次のように宣言されていることです。
MarkAurelius、2014

288
str.lengthメソッドを追加するのは非常に困難でした。(怒りで彼の拳を上げます)
ボットボット14

13
Swift 2では、これだけを機能させることができます。letlen = test1.characters.count
Laurent

7
Swift 4では、それがになることに注意してくださいstring.count
マーティンR

335

TLDR:

スウィフト2.0および3.0、使用test1.characters.count。ただし、知っておくべきことがいくつかあります。だから、読んでください。

Swiftで文字を数える

Swift 2.0以前countは、グローバル関数でした。Swift 2.0以降では、メンバー関数として呼び出すことができます。

test1.characters.count

これはのUnicode文字の実際の数を返すStringので、文字列を出力して文字をカウントすると、同じ結果が得られるという意味で、最も正しい代替手段です。

ただし、この方法StringsはSwiftに実装されているため、文字が常に同じ量のメモリを使用するわけではないため、これは他の言語の通常の文字カウントメソッドとはまったく異なる動作をすることに注意してください。

たとえば、次を使用することもできます test1.utf16.count

以下に示すようしかし、返される値は、呼び出し元のものと同じであることが保証されていませんcountcharacters

言語リファレンスから:

拡張書記素クラスターは、1つ以上のUnicodeスカラーで構成できます。つまり、さまざまな文字(および同じ文字のさまざまな表現)では、格納するメモリの量が異なる可能性があります。このため、Swiftの文字は、文字列の表現内で同じ量のメモリを使用しません。その結果、拡張された書記素クラスターの境界を決定するために文字列を反復処理しないと、文字列の文字数を計算できません。特に長い文字列値を使用している場合は、その文字列の文字を決定するために、文字プロパティ全体で文字列のUnicodeスカラーを反復処理する必要があることに注意してください。

charactersプロパティによって返される文字数は、同じ文字を含むNSStringの長さプロパティと常に同じとは限りません。NSStringの長さは、文字列内のUnicode拡張書記素クラスタの数ではなく、文字列のUTF-16表現内の16ビットコード単位の数に基づいています。

上記の状況を完全に示す例は、コメントのn00neimp0rtantで指摘されているように、単一の絵文字を含む文字列の長さをチェックする場合です。

var emoji = "👍"
emoji.characters.count             //returns 1
emoji.utf16.count                  //returns 2

26
詳細で注意深い回答に感謝しますが、不安を感じていることを認めざるを得ません。あなたは私に文字列の長さを取得する3つの方法を与えましたが、それらすべてが与える答えはあなたが期待するものではないかもしれないという免責事項があります。文字列の正確で信頼できる長さの値を取得するためのSwiftに組み込まれた信頼できる方法は本当にありませんか?
n00neimp0rtant 2014

6
@ n00neimp0rtant。はっきりしないと申し訳ありません。最初のソリューション(countElements())は、文字列の正確な文字数を取得します。[str length]Objective-Cでの呼び出しとは異なる場合があります。lengthメソッドは、文字列内のすべての文字が16ビットのコード単位で構成されているものと想定しcountElements()、実際のUnicode文字数を取得するためです。ただし、特に英語の一般的な文字を使用している場合は、ほとんどの場合、上記のすべての代替方法で同じ結果が返されます。
セザール

2
@ n00neimp0rtant私は私の答えを少し微調整して、より明確にするようにしました。
Cezar

2
私はあなたが今何を意味するかを理解しています。絵文字を1つ含む文字列の長さを取得しようとしました。Objective-Cの値は4で、Swiftの値は1です。したがって、実際にはより正確に見えます(したがって、皮肉にも「期待どおりではありませんでした」= P)。説明をありがとう!
n00neimp0rtant 2014

1
@ n00neimp0rtantまさに!それは完璧な例です。私もそれを答えに追加します
Cezar

92

Swift 1.2アップデート:コレクションのサイズをカウントするcountElementsはなくなりました。代わりにcount関数を使用してください:count( "Swift")

Swift 2.0、3.0、3.1:

strLength = string.characters.count

Swift 4.2(4.0以降):[Apple Documentation-Strings]

strLength = string.count


61

Swift 1.1

extension String {
    var length: Int { return countElements(self) }  // 
}

Swift 1.2

extension String {
    var length: Int { return count(self)         }  // 
}

Swift 2.0

extension String {
    var length: Int { return characters.count    }  // 
}

Swift 4.2

extension String {
    var length: Int { return self.count }           
}

let str = "Hello"
let count = str.length    // returns 5 (Int)

6
はい、毎月変更されるSwiftの構文の抽象化レイヤーが必要です!
Cosmin、2016年

@LeeこれはSwift 4では機能しません。文字は非推奨であるためです。もぐらたたきが続いています。ため息
エオニスト2017年

48

スウィフト4

"string".count

;)

スウィフト3

extension String {
    var length: Int {
        return self.characters.count
    }
}

使用法

"string".length


String.CharacterView.IndexDistanceを返します。Intはどうですか?
eonist 2017年

@GitSyncどこ?私はあなたを理解していません
Vyacheslav '10

@Vyacheslav in swift 4 "string" .count returns String.CharacterView.IndexDistanceここで私の答えを参照してください:stackoverflow.com/a/47203597/5389500を使用してintをswift 3と4に入れてください
eonist

私はこれが遊び場であることをテストしました:
Vyacheslav '10

//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground" print(type(of: str.characters.count)) print(type(of: str.count))
Vyacheslav 2017年

25

文字列が空であるかどうかを確認しようとしているだけの場合(長さが0かどうかを確認)、Swiftは単純なブールテストメソッドを提供しています String

myString.isEmpty

このコインの反対側は、ObjectiveCで文字列が空であるかどうかを尋ねる方法を尋ねている人々で、答えは長さ0をチェックすることでした。

NSStringは空です


18

tl; dr人間が読める文字数で文字列型の長さを知りたい場合は、countElements()を使用します。拡張された書記素クラスタの数で長さを知りたい場合は、endIndexを使用します。詳細については以下をお読みください。

文字列型は、Unicode文字の順序付きコレクション(すなわち、配列)として実装され、それはに適合さCollectionTypeはされに準拠プロトコル、_CollectionTypeの入力タイプにより期待されているプロトコル)countElements( 。したがって、countElements()を呼び出してString型を渡すと、文字数が返されます。

ただし、次に_CollectionTypeに準拠するCollectionTypeに準拠して、StringstartIndexおよびendIndex計算プロパティも実装します。これらのプロパティは、実際は最初の文字クラスターののインデックスの位置と最後の文字クラスターののインデックスの位置をそれぞれ表します。 。したがって、文字列「ABC」では、Aの前とCの後のインデックスの位置は3です。したがって、endIndex = 3は文字列の長さでもあります。

したがって、endIndexを使用して任意のString型の長さを取得できます。

ええと、常にではありません... Unicode文字は実際には拡張された書記素クラスタです。これは、1 つ以上の Unicodeスカラーを組み合わせて人間が読める単一の文字を作成したシーケンスです。

let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝

circledStarは、U + 2606(白い星)とU + 20DD(結合する囲み円)で構成される単一のキャラクターです。circledStarから文字列を作成し、countElements()endIndexの結果を比較してみましょう。

let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2

15

Swift 2.0ではcount動作しなくなりました。代わりにこれを使用できます:

var testString = "Scott"
var length = testString.characters.count

14

以下は、グローバル関数を使用するよりも短く、より自然なものです。

aString.utf16count

しかし、それがベータ1で利用できるかどうかはわかりません。しかし、ベータ2には確実に含まれています。


2
セザールの答えを見てください。ほとんどの人の「文字」の定義では、これは必ずしも文字列内の「文字」の数を与えるわけではありません。それでも、Objective-Cはどちらもしませんでした—気にするかどうかはあなた次第です。
jbg 14

12

Swift 5.1、5

let flag = "🇵🇷"

print(flag.count)
// Prints "1" --  Counts the characters and emoji as length 1

print(flag.unicodeScalars.count)
// Prints "2" --  Counts the unicode lenght ex. "A" is 65

print(flag.utf16.count)
// Prints "4"

print(flag.utf8.count)
// Prints "8"

11

Xcode 6ベータ4用に更新、メソッドutf16count-> utf16Countを変更

 var test1: String = "Scott"
 var length =  test1.utf16Count

または

 var test1: String = "Scott"
 var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)

絵文字で複雑な文字列を使用している場合、答えutf16countは間違ったものになります
Victor Sigler

10

Swift 1.2以降utf16Countは削除されました。ここで、グローバルcount()関数を使用して、文字列のUTF16ビューを渡す必要があります。以下の例...

let string = "Some string"
count(string.utf16)

1
.utf16countよりも遅いですか?
samir105 2015

1
.utf16countと同じ速度で、count(string)よりはるかに高速です
samir105

8

Xcode 7.3およびSwift 2.2の場合。

let str = "🐶"
  1. ビジュアルキャラクターの数が必要な場合:

    str.characters.count
  2. 「文字列のUTF-16表現内の16ビットコード単位」が必要な場合:

    str.utf16.count

ほとんどの場合、1が必要です。

いつ2が必要ですか?私は2のユースケースを見つけました:

let regex = try! NSRegularExpression(pattern:"🐶", 
    options: NSRegularExpressionOptions.UseUnixLineSeparators)
let str = "🐶🐶🐶🐶🐶🐶"
let result = regex.stringByReplacingMatchesInString(str, 
    options: NSMatchingOptions.WithTransparentBounds, 
    range: NSMakeRange(0, str.utf16.count), withTemplate: "dog")
print(result) // dogdogdogdogdogdog

1を使用すると、結果は正しくありません。

let result = regex.stringByReplacingMatchesInString(str, 
    options: NSMatchingOptions.WithTransparentBounds, 
    range: NSMakeRange(0, str.characters.count), withTemplate: "dog")
print(result) // dogdogdog🐶🐶🐶

7

あなたはこのように試すことができます

var test1: String = "Scott"
var length =  test1.bridgeToObjectiveC().length

4
それは同じですtest1.utf16count
スルタン

1
@vladofまあ、それは「一種の」作品です。セザールの答えを見てください。
jbg 14

6

Swift 2.xでは、次は文字列の長さを見つける方法です

let findLength = "This is a string of text"
findLength.characters.count

24を返します


5

Swift 2.0:カウントを取得: yourString.text.characters.count

これがどのように役立つかを示す楽しい例は、UITextViewでいくつかの数値(たとえば150)から文字のカウントダウンを表示することです。

func textViewDidChange(textView: UITextView) {
    yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}

4

swift4ではstring.count、今日までずっと使用してきました。

string.endIndex.encodedOffset

は、50 000文字の場合、文字列の方が約6倍速いため、より優れた置換です.count.count文字列の長さに依存するが、.endIndex.encodedOffsetしません。

しかし、NOは1つあります。絵文字を含む文字列には適していません.count。間違った結果が得られるため、正しいものだけを使用してください。


3

ではスウィフト4:文字列はUnicode文字が含まれていない場合は、以下のものを使用し

let str : String = "abcd"
let count = str.count // output 4

文字列にUnicode文字が含まれている場合は、以下を使用します。

let spain = "España"
let count1 = spain.count // output 6
let count2 = spain.utf8.count // output 7

なぜ使用したいutf8.countですか?それは文字数を与えません。文字列のUTF-8エンコーディングに必要なバイト数を示します。
rmaddy

2

Xcode 6.1.1の場合

extension String {    
    var length : Int { return self.utf16Count  }
}

私はすべてのマイナーバージョンでこれを変更すると思います。


2

テキストビューまたはテキストフィールドから文字列値を取得します。

let textlengthstring = (yourtextview?.text)! as String

文字列内の文字数を確認します。

let numberOfChars = textlength.characters.count

2

これが私がやったことです

let replacementTextAsDecimal = Double(string)

if string.characters.count > 0 &&
    replacementTextAsDecimal == nil &&
    replacementTextHasDecimalSeparator == nil {
        return false
}

文字列の長さを取得する以上のことを試みていると思いますが、いずれにしてもこれは不完全に見えます(return true大文字小文字の区別もないはずですか?)。もう一度確認して、できれば回答を編集してください。ありがとうございました!
Fabioはモニカ

2

Swift 4の更新とSwift 3の比較

Swift 4では、Stringの文字配列の必要がなくなりました。つまり、count最初に文字配列を取得せずに、文字列を直接呼び出すことができます。

"hello".count                  // 5

一方、Swift 3では、文字配列を取得して、その配列の要素を数える必要があります。この次のメソッドはcharacters、指定した文字列の文字配列にアクセスするために呼び出すことができるため、Swift 4.0でも引き続き使用できます。

"hello".characters.count       // 5

Swift 4.0もUnicode 9を採用しており、書記素クラスターを解釈できるようになりました。たとえば、絵文字を数えると1が返されますが、Swift 3.0では1を超える数になる場合があります。

"👍🏽".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"👨‍❤️‍💋‍👨".count // Swift 4.0 prints 1, Swift 3.0 prints 4

2

スウィフト4

let str =  "Your name"

str.count 

覚えておいてください:スペースも数にカウントされます


2

拡張機能を記述するだけで長さを取得できます。

extension String {
    // MARK: Use if it's Swift 2
    func stringLength(str: String) -> Int {
        return str.characters.count
    }

    // MARK: Use if it's Swift 3
    func stringLength(_ str: String) -> Int {
        return str.characters.count
    }

    // MARK: Use if it's Swift 4
    func stringLength(_ str: String) -> Int {
        return str.count
    }
}

1
var str = "Hello, playground"
var newString = str as NSString    

countElements(str)

これは、Regular Swift Stringの文字をカウントします

countElements((newString as String))    

NSString内の文字をカウントします


1

Swiftで文字列を数える最善の方法はこれです:

var str = "Hello World"
var length = count(str.utf16)

2
count(str)だけを使用する必要があります。サブ文字のadvance()を使用してtu use count(str.utf16)を試してください
Leo

1

StringとNSStringは無料のブリッジなので、NSStringで利用可能なすべてのメソッドを迅速なStringで使用できます

let x = "test" as NSString
let y : NSString = "string 2"
let lenx = x.count
let leny = y.count


1

アップルはそれを他の主要な言語と異なるものにしました。現在の方法は以下を呼び出すことです:

test1.characters.count

ただし、注意してください。長さとは、バイト数ではなく文字数を意味します。ASCII以外の文字を使用すると、これら2つが異なる可能性があるためです。

例えば; "你好啊hi".characters.count5になりますが、これはバイト数ではありません。実際のバイト数を取得するには、を実行する必要があります"你好啊hi".lengthOfBytes(using: String.Encoding.utf8)。これで11になります。


1

現在(Swift 2.3)を使用している場合:

myString.characters.count 

このメソッドは「距離」タイプを返します。整数を返すメソッドが必要な場合は、次のようにキャストを入力する必要があります。

var count = myString.characters.count as Int

2
IS、このキャストは必要ないはずです。DistanceString.CharacterView Int
Martin R
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.