web-dev-qa-db-ja.com

文字列の長さを取得する

どうやってStringの長さを知るのですか?たとえば、次のように定義された変数があります。

var test1: String = "Scott"

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

729
Scott Walter

Swift 4以降

それはただ:

test1.count

理由で。

(Martin Rに感謝します)

Swift 2以降:

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

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 Guideから直接

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

あなたの変数の場合、それはなるでしょう

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

あるいはtest1.utf16countを使うことができます。

1189
milesper

TLDR:

Swift 2.0および3.0の場合は、 test1.characters.countを使用します。しかし、知っておくべきことがいくつかあります。それで、読んでください。

Swiftで文字を数える

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

test1.characters.count

それはString内のUnicode文字の実際の数を返すので、文字列を印刷して文字を手で数えても同じ結果が得られるという意味で最も正しい選択肢です。

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

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

しかし、後述するように、戻り値がcountに対してcharactersを呼び出すのと同じになるとは限りません。

言語参照から

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

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

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

var emoji = "????"
emoji.characters.count             //returns 1
emoji.utf16.count                  //returns 2
332
Cezar

Swift 1.2 Update:コレクションのサイズを数えるためのcountElementsはもうない。代わりにcount関数を使うだけです:count( "Swift")

Swift 2.0、3.0、3.1: 

strLength = string.characters.count </strike>

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

strLength = string.countとします。

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

extension String {
    var length: Int { return countElements(self) }  // Swift 1.1
}
extension String {
    var length: Int { return count(self)         }  // Swift 1.2
}
extension String {
    var length: Int { return characters.count    }  // Swift 2.0
}
extension String {
    var length: Int { return self.count }           // Swift 4.2
}
58
whitneyland

スイフト4

"string".count

;)

スイフト3

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

使用法

"string".length

46
Vyacheslav

文字列が空かどうかを調べようとしているだけの場合(長さ0のチェック)、SwiftはStringに対して単純なブール値テストメソッドを提供します

myString.isEmpty

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

NSStringが空です

tl; dr人間が読める文字数でString型の長さを求めたい場合は、countElements()を使用してください。長さを拡張書記素クラスタの数)で知りたい場合は、endIndexを使用してください。

String型は、Unicode文字の順序付きコレクション(つまり、シーケンス)として実装され、CollectionTypeプロトコルに準拠します。これは、_CollectionTypeプロトコルに準拠しています。これは、countElements()が想定する入力タイプです。したがって、countElements()を呼び出してString typeを渡すと、文字数が返されます。

ただし、CollectionType、つまり{_CollectionType}に準拠すると、StringstartIndexendIndexを実装します。 _計算されたプロパティ。実際にはインデックス最初の文字クラスタの位置、およびインデックス最後の文字クラスタの位置)の位置を表します。したがって、文字列 "ABC"では、位置したがって、endIndex = 3は、文字列の長さでもあります。

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

Unicode文字は実際には拡張書記素クラスタ、1つのまたはそれ以上=Unicodeのスカラ)を組み合わせたもので、人間が読める単一の文字を作成します。

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

circledStarは、U + 2606(白い星)とU + 20DD(結合囲み円)で構成される単一の文字です。 circledStarからStringを作成し、countElements()endIndexの結果を比較します。

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

Swift 2.0ではcountは動かなくなりました。代わりにこれを使うことができます:

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

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

aString.utf16count

しかし、それがベータ1で利用可能かどうかはわかりません。しかし、それは間違いなくベータ2にあります。

14
Jean Le Moignan

Xcode 6 Beta 4用に更新、メソッドutf16countの変更 - > utf16Count

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

または

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

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

let string = "Some string"
count(string.utf16)
10
Jeremy Fox

XCode 7.3とSwift 2.2の場合。

let str = "????"

1) 視覚文字数が必要な場合:

str.characters.count // 1

2) 16-bit code units within the string’s UTF-16 representationが欲しいなら:

str.utf16.count // 2



ほとんどの場合、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
Tyler Long

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

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

swift 2.xでは、以下は文字列の長さを見つける方法です。

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

24を返します

6
Adam

Swift 2.0:カウントを数える:yourString.text.characters.count

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

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

スイフト4.2

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"
4
Saranjith

Swift 4では、今日までずっとstring.countを使用していましたが、 

string.endIndex.encodedOffset

50 000文字の場合、stringは.countよりも約6倍高速です。 .countは文字列の長さに依存しますが、.endIndex.encodedOffsetはそうではありません。 

しかし、NOが1つあります。 emojisを含む文字列には向いていません。間違った結果をもたらすので、.countだけが正しいです。 

3
VYT

に スイフト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
3
Ashis Laha

これは私がやってしまったものです

let replacementTextAsDecimal = Double(string)

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

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

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

文字列内の文字数を見つけます。

let numberOfChars = textlength.characters.count
2
kalyan711987

Xcode 6.1.1の場合 

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

私は、brainiacsがすべてのマイナーバージョンでこれを変えるだろうと思います。

2
user3812138

スイフト4

let str =  "Your name"

str.count 

覚えておいてください:スペースも数に含まれています 

2
Mr.Shin

単純に拡張子を書くことで長さを知ることができます

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
    }
}
2
Riajur Rahman

アップルは他の主要言語とは違うものにしました。現在の方法は以下を呼び出すことです。

test1.characters.count

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

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

1
Frank

今使っているなら(Swift 2.3では):

myString.characters.count 

このメソッドは "Distance"タイプを返します。もしあなたがこのメソッドがIntegerを返すのに必要であれば、あなたはそのようにcastとタイプするべきです:

var count = myString.characters.count as Int
1
Jesse

swift 3/4のための私の2セント

条件付きでコンパイルする必要がある場合

    #if Swift(>=4.0)
            let len = text.count
        #else
            let len = text.characters.count
        #endif
1
ingconti

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

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

Swift 3と比較したSwift 4の更新

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

"hello".count                  // 5

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

"hello".characters.count       // 5

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

"????????".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"????‍❤️‍????‍????".count // Swift 4.0 prints 1, Swift 3.0 prints 4
1
Fangming
var str = "Hello, playground"
var newString = str as NSString    

countElements(str)

これはRegular Swift Stringの文字数を数えます

countElements((newString as String))    

これはNSStringの文字数を数える

1
brokenrhino

StringとNSStringはフリーダイヤルブリッジなので、NSStringで利用可能なすべてのメソッドをSwift Stringで使用できます。

let x = "test" as NSString
let y : NSString = "string 2"
let lenx = x.count
let leny = y.count
1
Tien Dinh
test1.characters.count

あなたの文字列の中の文字/数字などの数を取得します。

例:

test1 = "StackOverflow"

print(test1.characters.count)

印刷 " 13 ")

1
Andy Lebowitz
// String literal
let s = "Hello world" 
// Get the length of the string
let length = s.characters.count
print(length) 
0

ユニバーサルSwift 4と3のソリューション

/**
 * Since Swift 4 There is also native count, But it doesn't return Int
 * NOTE: was: var count:Int { return self.characters.count }
 * EXAMPLE: "abc????".count//Output: 4
 */
extension String{
    var count:Int {
        return self.distance(from: self.startIndex, to: self.endIndex)
    }
}
0
eonist

あなたはstr.utf8.countstr.utf16.countを使うことができます。

0
euvl

Xcode 6.4 Swift 1.2 および iOS 8.4 :の使用

    //: Playground - noun: a place where people can play

    import UIKit

    var str = "  He\u{2606}  "
    count(str) // 7

    let length = count(str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())) as Int // 3
    println(length == 3) // true
0
King-Wizard

あなたの拡張機能にこの機能を追加することができます

extension NSString { 
    func charLength() -> Int {
        return count(self as String)
    }
}
0
Prakash Raj

Swift 5.0の文字列は、個々の文字の配列として扱うことができます。したがって、文字列の長さを返すには、yourString.countを使用して、「文字」配列内の項目の数を数えます。

0

文字列の長さを数えたい場合 

この非常に簡単な方法を試してください。

Swiftの場合:

var test1: String = "Scott"

コードの下の行は文字列の長さを数えることです:

test1.count

またはuもこれを試すことができます:

test1.characters.count

これはあなたを助けるでしょう。

ありがとうございました。

0
Bhaumik Joshi

Swift 4.1とXcode 9.4.1の場合

Objective CとSwiftで長さを取得する方法は異なります。 Obj-cでは length propertyを使いますが、Swiftでは count propertyを使います。

例:

//In Swift
let stringLenght = "This is my String"
print(stringLenght.count)

//In Objective C
NSString * stringLenght = @"This is my String";
NSLog(@"%lu", stringLenght.length);
0
iOS

test1.endIndexはSwift 3のtest1.characters.countと同じ結果になります。

0
Thracian

Swift 4.2とXcode 10.1では

Swiftでは、文字列は個々の文字の配列のように扱うことができます。つまり、stringの各文字は配列の要素のようなものです。文字列の長さを取得するには、 yourStringName.count propertyを使用します。

In スイフト

yourStringName.characters.countプロパティは非推奨です。そのためstrLength.countプロパティを直接使用してください。

let strLength = "This is my string"
print(strLength.count)
//print(strLength.characters.count) //Error: 'characters' is deprecated: Please use String or Substring directly

If 目標C

NSString *myString = @"Hello World";
NSLog(@"%lu", [myString length]); // 11
0
iOS