문자열의 길이를 가져옵니다


781

길이는 어떻게 얻 String습니까? 예를 들어 다음과 같이 정의 된 변수가 있습니다.

var test1: String = "Scott"

그러나 문자열에서 길이 방법을 찾지 못하는 것 같습니다.



Swift 3 때문에 많은 코드를 수동으로 마이그레이션해야했기 때문에 확장을 만들기로 결정했습니다. 이제 새로운 주요 릴리스로 업그레이드해야하는 경우 확장 기능 만 마이그레이션하면됩니다. 여기 내가 만든 Swift 3 확장을 찾을 수 있습니다. github.com/tukur187/Swift3
Shkelzen

답변:


1284

스위프트 4+ 기준

그냥 :

test1.count

이유가 있습니다.

(마틴 R 감사합니다)

스위프트 2 :

Swift 2를 통해 Apple은 글로벌 기능을 프로토콜 확장, 프로토콜에 맞는 모든 유형과 일치하는 확장으로 변경했습니다. 따라서 새로운 구문은 다음과 같습니다.

test1.characters.count

(JohnDifool에게 감사드립니다)

스위프트 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를 사용할 수 있습니다


11
countElements가 전역 함수라는 점에 흥미가 있습니다. 전역 함수 목록이 있습니까?
Scott Walter

7
countElements의 문제점은 func countElements <T> (x : T)-> T.IndexType.DistanceType과 같이 선언되고 반환 유형이 + 연산을 허용하지 않는다는 것입니다.
MarkAurelius

288
str.length 메소드를 추가하는 것은 너무 어려웠습니다. (그의 분노의 주먹을 제기)
botbot

13
Swift 2를 사용하면 다음과 같이 작동합니다. let len ​​= test1.characters.count
Laurent

7
Swift 4를 사용하면 다음과 같습니다 string.count.
Martin R

335

TLDR :

대한 스위프트 2.0 및 3.0, 사용test1.characters.count . 그러나 알아야 할 것이 몇 가지 있습니다. 계속 읽어보십시오.

Swift에서 문자 세기

Swift 2.0 이전 count에는 전역 기능이었습니다. Swift 2.0부터는 멤버 함수로 호출 될 수 있습니다.

test1.characters.count

실제 유니 코드 문자 수를로 반환 String하므로 문자열을 인쇄하고 문자를 직접 계산하면 동일한 결과를 얻는다는 점에서 가장 올바른 대안입니다.

그러나 StringsSwift에서 구현 되는 방식으로 인해 문자가 항상 같은 양의 메모리를 차지하는 것은 아니므로 다른 언어의 일반적인 문자 수 방법과는 상당히 다르게 작동합니다.

예를 들어 test1.utf16.count

그러나 아래에 언급 된 것처럼 반환 된 값이 counton 호출의 값과 동일하지는 않습니다 characters.

언어 참조에서 :

확장 grapheme 클러스터는 하나 이상의 유니 코드 스칼라로 구성 될 수 있습니다. 이것은 다른 문자들과 같은 문자의 다른 표현들이 저장하기 위해 다른 양의 메모리를 요구할 수 있음을 의미합니다. 이 때문에 Swift의 문자는 각각 문자열 표현 내에서 동일한 양의 메모리를 차지하지 않습니다. 결과적으로 확장 된 grapheme 클러스터 경계를 결정하기 위해 문자열을 반복하지 않으면 문자열의 문자 수를 계산할 수 없습니다. 특히 긴 문자열 값을 사용하는 경우 characters 속성은 해당 문자열의 문자를 결정하기 위해 전체 문자열의 유니 코드 스칼라를 반복해야합니다.

characters 속성이 반환하는 문자 수는 항상 동일한 문자를 포함하는 NSString의 length 속성과 동일하지는 않습니다. NSString의 길이는 문자열의 UTF-16 표현 내 16 비트 코드 단위 수를 기반으로하며 문자열 내의 유니 코드 확장 grapheme 클러스터 수는 아닙니다.

위에서 설명한 상황을 완벽하게 보여주는 예 는 주석에서 n00neimp0rtant 가 지적한 것처럼 단일 이모 지 문자가 포함 된 문자열의 길이를 확인하는 것 입니다.

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

26
귀하의 상세하고 신중한 답변에 감사 드리지만, 불편한 점이 있음을 인정해야합니다. 줄의 길이를 얻는 세 가지 방법을 알려주었습니다. 면책 조항에 따라 대답이 예상과 다를 수 있습니다. 문자열의 정확하고 안정적인 길이 값을 얻기 위해 Swift에 신뢰할 수있는 방법이 내장되어 있지 않습니까?
n00neimp0rtant

6
@ n00neimp0rtant. 명확하지 않으면 죄송합니다. 첫 번째 솔루션 ( countElements())은 문자열에서 정확한 문자 수를 가져옵니다. 이 메서드는 문자열의 모든 문자가 16 비트 코드 단위로 구성되어 있고 실제 유니 코드 문자 수 를 가져 오기 [str length]때문에 Objective-C 에서 호출 할 때와 다를 수 있습니다. 그러나 대부분의 경우 위의 모든 대안은 특히 영어 공용 문자로 작업하는 경우 동일한 결과를 반환합니다. lengthcountElements()
Cezar

2
@ n00neimp0rtant 나는 좀 더 명확하게하기 위해 대답을 약간 조정했습니다.
Cezar

2
무슨 말인지 알 겠어 방금 단일 Emoji 문자가 포함 된 문자열의 길이를 얻으려고했습니다. Objective-C는 나에게 4의 가치를 주었고, Swift는 나에게 1의 가치를주었습니다. 따라서 실제로는 더 정확 해 보입니다. 설명 주셔서 감사합니다!
n00neimp0rtant

1
@ n00neimp0rtant 정확히! 완벽한 예입니다. 답변에 추가하겠습니다
Cezar

92

Swift 1.2 업데이트 : 더 이상 컬렉션 크기를 계산하기위한 countElements가 없습니다. count 함수를 대체로 사용하십시오 : count ( "Swift")

스위프트 2.0, 3.0 및 3.1 :

strLength = string.characters.count하자

Swift 4.2 (4.0 이상) : [Apple Documentation-Strings]

strLength = string.count


61

스위프트 1.1

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

스위프트 1.2

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

스위프트 2.0

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

스위프트 4.2

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

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

6
예, 우리는 매달 바뀌는 Swift의 구문에 대한 추상화 계층이 필요합니다!
코스 민

@Lee 문자가 더 이상 사용되지 않으므로 빠른 4.에서는 작동하지 않습니다. whac-a-mole은 계속 돌아 다닙니다. 한숨
eonist

48

스위프트 4

"string".count

;)

스위프트 3

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

용법

"string".length


String.CharacterView.IndexDistance를 반환합니다. Int는 어떻습니까?
eonist

@GitSync 어디? 나는 당신을 이해하지 못합니다
Vyacheslav

빠른 4 @Vyacheslav "문자열".count 반환 String.CharacterView.IndexDistance 참조 여기 내 대답 : stackoverflow.com/a/47203597/5389500은 빠른 3과 4에서 INT를 얻을
eonist

나는 이것이 놀이터라고 테스트했습니다 :
Vyacheslav

//: 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

25

문자열이 비어 있는지 아닌지 (길이 0 확인) Swift는 간단한 부울 테스트 방법을 제공합니다. String

myString.isEmpty

이 코인의 다른 쪽은 ObjectiveC에서 길이가 0인지 확인하는 문자열이 비어 있는지 묻는 방법을 묻는 사람들이었습니다.

NSString이 비어 있습니다


18

tl; dr 사람이 읽을 수있는 문자 수로 String 유형의 길이를 원하면 countElements ()를 사용 하십시오 . 확장 된 grapheme 클러스터 수로 길이를 알고 싶다면 endIndex를 사용하십시오 . 자세한 내용은 계속 읽으십시오.

문자열 유형은 정렬 된 컬렉션을 유니 코드 문자 (즉, 순서)로 구현되며, 그것은을 준수 CollectionType의 프로토콜은 어떤 부합 함을 선언합니다 _CollectionType의 예상 입력 유형 프로토콜, countElements은 () . 따라서 countElements () 를 호출하여 String 유형을 전달하면 문자 수를 반환합니다.

그러나 따르는에 CollectionType 에 회전 따르는 것으로에서 _CollectionType , 문자열 또한 구현 에서 startIndexendIndex에 실제로 인덱스의 위치를 나타내는 연산 특성 전에 첫 문자 클러스터 및 인덱스의 위치 후에 , 마지막 문자 클러스터 각각 . 따라서 문자열 "ABC"에서 A 이전의 인덱스 위치는 0이고 C 이후의 인덱스 위치는 3입니다. 따라서 endIndex = 3이며 문자열의 길이이기도합니다.

따라서 endIndex 를 사용하여 모든 문자열 유형의 길이를 얻을 수 있습니다.

항상 그렇지는 않습니다 ... 유니 코드 문자는 실제로 확장 된 grapheme 클러스터입니다 . 이것은 단일 인간 판독 가능 문자를 만들기 위해 결합 된 하나 이상의 유니 코드 스칼라 시퀀스입니다 .

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
Cezar의 답변을 참조하십시오. 이것은 대부분의 사람들이 "문자"를 정의하기 위해 반드시 문자열에 "문자"의 수를 줄 필요는 없습니다. 그런 다음 Objective-C도 마찬가지였으며, 관리 여부를 결정하는 것은 귀하의 몫입니다.
jbg

12

스위프트 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

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
Sulthan

1
@vladof, 잘 작동합니다. Cezar의 답변을 참조하십시오.
jbg

6

Swift 2.x에서 다음은 문자열의 길이를 찾는 방법입니다

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

24를 반환


5

스위프트 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가 있습니다. 이모지가있는 문자열에는 적합하지 않습니다. 잘못된 결과를 제공하므로 .count정확합니다.


3

에서 스위프트 4 : 문자열 않으면 유니 코드 문자를 한 후 다음을 사용하여 포함하지

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

문자열에 유니 코드 문자가 포함되어 있으면 다음을 사용하십시오.

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  }
}

나는 brainiacs가 모든 작은 버전에서 이것을 바꿀 것이라고 생각합니다.


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에 따르면 Reinstate Monica는

2

스위프트 4와 스위프트 3 비교

Swift 4는 String에서 문자 배열이 필요하지 않습니다. 즉, count문자 배열을 먼저 얻지 않고도 문자열을 직접 호출 할 수 있습니다 .

"hello".count                  // 5

신속한 3에서는 문자 배열을 가져온 다음 해당 배열의 요소를 계산해야합니다. characters주어진 문자열의 문자 배열에 액세스하기 위해 여전히 호출 할 수 있으므로이 방법은 swift 4.0에서 여전히 사용 가능 합니다.

"hello".characters.count       // 5

Swift 4.0은 유니 코드 9도 채택하여 grapheme 클러스터를 해석 할 수 있습니다. 예를 들어, 이모티콘을 사용하면 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

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)

정규 스위프트 문자열의 문자 수

countElements((newString as String))    

NSString의 문자 수


1

Swift에서 문자열을 계산하는 가장 좋은 방법은 다음과 같습니다.

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

2
count (str) 만 사용해야합니다. 하위 문자열 advance ()와 함께 count (str.utf16)를 사용하십시오.
Leo Dabus

1

String 및 NSString은 무료 브리지이므로 NSString에서 사용 가능한 모든 메소드를 빠른 문자열로 사용할 수 있습니다

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

1
test1.characters.count

문자열의 문자 / 숫자 등을 얻을 수 있습니다.

전의:

test1 = "StackOverflow"

print(test1.characters.count)

( " 13 " 인쇄 )


1

애플은 그것을 다른 주요 언어와 다르게 만들었다. 현재 방법은 다음과 같습니다 :

test1.characters.count

그러나 길이를 말할 때 바이트 수가 아닌 문자 수를 의미합니다. ASCII가 아닌 문자를 사용할 때 두 문자가 다를 수 있기 때문에주의하십시오.

예를 들어; "你好啊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
의은 Distance( String.CharacterView Int )이 캐스트가 필요하지 않습니다.
Martin R
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.