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

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

var test1: String = "Scott"

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



답변

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


답변

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


답변

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


답변

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


답변

스위프트 4

"string".count

😉

스위프트 3

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

용법

"string".length


답변

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

myString.isEmpty

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

NSString이 비어 있습니다


답변

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