どうやってString
の長さを知るのですか?たとえば、次のように定義された変数があります。
var test1: String = "Scott"
しかし、文字列に長さメソッドが見つからないようです。
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を使うことができます。
Swift 2.0および3.0の場合は、 test1.characters.count
を使用します。しかし、知っておくべきことがいくつかあります。それで、読んでください。
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
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とします。
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
}
スイフト4
"string".count
;)
スイフト3
extension String {
var length: Int {
return self.characters.count
}
}
使用法
"string".length
文字列が空かどうかを調べようとしているだけの場合(長さ0のチェック)、SwiftはString
に対して単純なブール値テストメソッドを提供します
myString.isEmpty
このコインの反対側は、ObjectiveCで、長さ0をチェックするという回答で、文字列が空かどうかを尋ねる方法を尋ねる人々でした。
tl; dr人間が読める文字数でString型の長さを求めたい場合は、countElements()を使用してください。長さを拡張書記素クラスタの数)で知りたい場合は、endIndexを使用してください。
String型は、Unicode文字の順序付きコレクション(つまり、シーケンス)として実装され、CollectionTypeプロトコルに準拠します。これは、_CollectionTypeプロトコルに準拠しています。これは、countElements()が想定する入力タイプです。したがって、countElements()を呼び出してString typeを渡すと、文字数が返されます。
ただし、CollectionType、つまり{_CollectionType}に準拠すると、StringもstartIndexとendIndexを実装します。 _計算されたプロパティ。実際にはインデックス前最初の文字クラスタの位置、およびインデックス後最後の文字クラスタの位置)の位置を表します。したがって、文字列 "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
Swift 2.0ではcount
は動かなくなりました。代わりにこれを使うことができます:
var testString = "Scott"
var length = testString.characters.count
これは、グローバル関数を使用するよりも短く、より自然なものです。
aString.utf16count
しかし、それがベータ1で利用可能かどうかはわかりません。しかし、それは間違いなくベータ2にあります。
Xcode 6 Beta 4用に更新、メソッドutf16countの変更 - > utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
または
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
Swift 1.2では、utf16Count
は削除されました。グローバルcount()
関数を使用して、文字列のUTF16ビューを渡す必要があります。以下の例...
let string = "Some string"
count(string.utf16)
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????????????
あなたはこのように試すことができます
var test1: String = "Scott"
var length = test1.bridgeToObjectiveC().length
swift 2.xでは、以下は文字列の長さを見つける方法です。
let findLength = "This is a string of text"
findLength.characters.count
24を返します
Swift 2.0:カウントを数える:yourString.text.characters.count
これがどのように役立つかの楽しい例は、UITextViewである数(例えば150)からの文字カウントダウンを示すことでしょう:
func textViewDidChange(textView: UITextView) {
yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}
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"
Swift 4では、今日までずっとstring.count
を使用していましたが、
string.endIndex.encodedOffset
50 000文字の場合、stringは.count
よりも約6倍高速です。 .count
は文字列の長さに依存しますが、.endIndex.encodedOffset
はそうではありません。
しかし、NOが1つあります。 emojisを含む文字列には向いていません。間違った結果をもたらすので、.count
だけが正しいです。
に スイフト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
これは私がやってしまったものです
let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&
replacementTextAsDecimal == nil &&
replacementTextHasDecimalSeparator == nil {
return false
}
テキストビューまたはテキストフィールドから文字列値を取得します。
let textlengthstring = (yourtextview?.text)! as String
文字列内の文字数を見つけます。
let numberOfChars = textlength.characters.count
Xcode 6.1.1の場合
extension String {
var length : Int { return self.utf16Count }
}
私は、brainiacsがすべてのマイナーバージョンでこれを変えるだろうと思います。
スイフト4
let str = "Your name"
str.count
覚えておいてください:スペースも数に含まれています
単純に拡張子を書くことで長さを知ることができます
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
}
}
アップルは他の主要言語とは違うものにしました。現在の方法は以下を呼び出すことです。
test1.characters.count
ただし、長さを指定するときは、バイト数ではなく文字数を意味します。これは、ASCII以外の文字を使用した場合、これら2つが異なる可能性があるためです。
例えば; "你好啊hi".characters.count
は5になりますが、これはバイト数ではありません。実際のバイト数を取得するには、"你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
を実行する必要があります。これはあなたに11を与えるでしょう。
今使っているなら(Swift 2.3では):
myString.characters.count
このメソッドは "Distance"タイプを返します。もしあなたがこのメソッドがIntegerを返すのに必要であれば、あなたはそのようにcastとタイプするべきです:
var count = myString.characters.count as Int
swift 3/4のための私の2セント
条件付きでコンパイルする必要がある場合
#if Swift(>=4.0)
let len = text.count
#else
let len = text.characters.count
#endif
Swiftで文字列を数えるための最良の方法はこれです:
var str = "Hello World"
var length = count(str.utf16)
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
var str = "Hello, playground"
var newString = str as NSString
countElements(str)
これはRegular Swift Stringの文字数を数えます
countElements((newString as String))
これはNSStringの文字数を数える
StringとNSStringはフリーダイヤルブリッジなので、NSStringで利用可能なすべてのメソッドをSwift Stringで使用できます。
let x = "test" as NSString
let y : NSString = "string 2"
let lenx = x.count
let leny = y.count
test1.characters.count
あなたの文字列の中の文字/数字などの数を取得します。
例:
test1 = "StackOverflow"
print(test1.characters.count)
( 印刷 " 13 ")
// String literal
let s = "Hello world"
// Get the length of the string
let length = s.characters.count
print(length)
/**
* 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)
}
}
あなたはstr.utf8.count
とstr.utf16.count
を使うことができます。
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
あなたの拡張機能にこの機能を追加することができます
extension NSString {
func charLength() -> Int {
return count(self as String)
}
}
Swift 5.0の文字列は、個々の文字の配列として扱うことができます。したがって、文字列の長さを返すには、yourString.countを使用して、「文字」配列内の項目の数を数えます。
文字列の長さを数えたい場合
この非常に簡単な方法を試してください。
Swiftの場合:
var test1: String = "Scott"
コードの下の行は文字列の長さを数えることです:
test1.count
またはuもこれを試すことができます:
test1.characters.count
これはあなたを助けるでしょう。
ありがとうございました。
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);
test1.endIndex
はSwift 3のtest1.characters.count
と同じ結果になります。
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