どのようにしてaの長さを取得しますString
か?たとえば、次のように定義された変数があります。
var test1: String = "Scott"
ただし、文字列に長さのメソッドが見つからないようです。
どのようにしてaの長さを取得しますString
か?たとえば、次のように定義された変数があります。
var test1: String = "Scott"
ただし、文字列に長さのメソッドが見つからないようです。
回答:
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を使用できます
string.count
。
スウィフト2.0および3.0、使用test1.characters.count
。ただし、知っておくべきことがいくつかあります。だから、読んでください。
Swift 2.0以前count
は、グローバル関数でした。Swift 2.0以降では、メンバー関数として呼び出すことができます。
test1.characters.count
これはのUnicode文字の実際の数を返すString
ので、文字列を出力して文字をカウントすると、同じ結果が得られるという意味で、最も正しい代替手段です。
ただし、この方法Strings
はSwiftに実装されているため、文字が常に同じ量のメモリを使用するわけではないため、これは他の言語の通常の文字カウントメソッドとはまったく異なる動作をすることに注意してください。
たとえば、次を使用することもできます test1.utf16.count
以下に示すようしかし、返される値は、呼び出し元のものと同じであることが保証されていませんcount
のcharacters
。
言語リファレンスから:
拡張書記素クラスターは、1つ以上のUnicodeスカラーで構成できます。つまり、さまざまな文字(および同じ文字のさまざまな表現)では、格納するメモリの量が異なる可能性があります。このため、Swiftの文字は、文字列の表現内で同じ量のメモリを使用しません。その結果、拡張された書記素クラスターの境界を決定するために文字列を反復処理しないと、文字列の文字数を計算できません。特に長い文字列値を使用している場合は、その文字列の文字を決定するために、文字プロパティ全体で文字列のUnicodeスカラーを反復処理する必要があることに注意してください。
charactersプロパティによって返される文字数は、同じ文字を含むNSStringの長さプロパティと常に同じとは限りません。NSStringの長さは、文字列内のUnicode拡張書記素クラスタの数ではなく、文字列のUTF-16表現内の16ビットコード単位の数に基づいています。
上記の状況を完全に示す例は、コメントのn00neimp0rtantで指摘されているように、単一の絵文字を含む文字列の長さをチェックする場合です。
var emoji = "👍"
emoji.characters.count //returns 1
emoji.utf16.count //returns 2
countElements()
)は、文字列の正確な文字数を取得します。[str length]
Objective-Cでの呼び出しとは異なる場合があります。length
メソッドは、文字列内のすべての文字が16ビットのコード単位で構成されているものと想定しcountElements()
、実際のUnicode文字数を取得するためです。ただし、特に英語の一般的な文字を使用している場合は、ほとんどの場合、上記のすべての代替方法で同じ結果が返されます。
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
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)
スウィフト4
"string".count
;)
スウィフト3
extension String {
var length: Int {
return self.characters.count
}
}
使用法
"string".length
//: 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))
文字列が空であるかどうかを確認しようとしているだけの場合(長さが0かどうかを確認)、Swiftは単純なブールテストメソッドを提供しています String
myString.isEmpty
このコインの反対側は、ObjectiveCで文字列が空であるかどうかを尋ねる方法を尋ねている人々で、答えは長さ0をチェックすることでした。
tl; dr人間が読める文字数で文字列型の長さを知りたい場合は、countElements()を使用します。拡張された書記素クラスタの数で長さを知りたい場合は、endIndexを使用します。詳細については以下をお読みください。
文字列型は、Unicode文字の順序付きコレクション(すなわち、配列)として実装され、それはに適合さCollectionTypeはされに準拠プロトコル、_CollectionTypeの入力タイプにより期待されているプロトコル)countElements( 。したがって、countElements()を呼び出してString型を渡すと、文字数が返されます。
ただし、次に_CollectionTypeに準拠するCollectionTypeに準拠して、StringはstartIndexおよび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
Xcode 6ベータ4用に更新、メソッドutf16count-> utf16Countを変更
var test1: String = "Scott"
var length = test1.utf16Count
または
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
utf16count
は間違ったものになります
Swift 1.2以降utf16Count
は削除されました。ここで、グローバルcount()
関数を使用して、文字列のUTF16ビューを渡す必要があります。以下の例...
let string = "Some string"
count(string.utf16)
Xcode 7.3およびSwift 2.2の場合。
let str = "🐶"
ビジュアルキャラクターの数が必要な場合:
str.characters.count
「文字列の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🐶🐶🐶
ではスウィフト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エンコーディングに必要なバイト数を示します。
Xcode 6.1.1の場合
extension String {
var length : Int { return self.utf16Count }
}
私はすべてのマイナーバージョンでこれを変更すると思います。
テキストビューまたはテキストフィールドから文字列値を取得します。
let textlengthstring = (yourtextview?.text)! as String
文字列内の文字数を確認します。
let numberOfChars = textlength.characters.count
これが私がやったことです
let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&
replacementTextAsDecimal == nil &&
replacementTextHasDecimalSeparator == nil {
return false
}
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
拡張機能を記述するだけで長さを取得できます。
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
文字列内の文字/数字などの数を取得します。
例:
test1 = "StackOverflow"
print(test1.characters.count)
(" 13 "を印刷)