길이는 어떻게 얻 String
습니까? 예를 들어 다음과 같이 정의 된 변수가 있습니다.
var test1: String = "Scott"
그러나 문자열에서 길이 방법을 찾지 못하는 것 같습니다.
길이는 어떻게 얻 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를 사용할 수 있습니다
string.count
.
대한 스위프트 2.0 및 3.0, 사용test1.characters.count
. 그러나 알아야 할 것이 몇 가지 있습니다. 계속 읽어보십시오.
Swift 2.0 이전 count
에는 전역 기능이었습니다. Swift 2.0부터는 멤버 함수로 호출 될 수 있습니다.
test1.characters.count
실제 유니 코드 문자 수를로 반환 String
하므로 문자열을 인쇄하고 문자를 직접 계산하면 동일한 결과를 얻는다는 점에서 가장 올바른 대안입니다.
그러나 Strings
Swift에서 구현 되는 방식으로 인해 문자가 항상 같은 양의 메모리를 차지하는 것은 아니므로 다른 언어의 일반적인 문자 수 방법과는 상당히 다르게 작동합니다.
예를 들어 test1.utf16.count
그러나 아래에 언급 된 것처럼 반환 된 값이 count
on 호출의 값과 동일하지는 않습니다 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
countElements()
)은 문자열에서 정확한 문자 수를 가져옵니다. 이 메서드는 문자열의 모든 문자가 16 비트 코드 단위로 구성되어 있고 실제 유니 코드 문자 수 를 가져 오기 [str length]
때문에 Objective-C 에서 호출 할 때와 다를 수 있습니다. 그러나 대부분의 경우 위의 모든 대안은 특히 영어 공용 문자로 작업하는 경우 동일한 결과를 반환합니다. length
countElements()
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
//: 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 사람이 읽을 수있는 문자 수로 String 유형의 길이를 원하면 countElements ()를 사용 하십시오 . 확장 된 grapheme 클러스터 수로 길이를 알고 싶다면 endIndex를 사용하십시오 . 자세한 내용은 계속 읽으십시오.
문자열 유형은 정렬 된 컬렉션을 유니 코드 문자 (즉, 순서)로 구현되며, 그것은을 준수 CollectionType의 프로토콜은 어떤 부합 함을 선언합니다 _CollectionType의 예상 입력 유형 프로토콜, countElements은 () . 따라서 countElements () 를 호출하여 String 유형을 전달하면 문자 수를 반환합니다.
그러나 따르는에 CollectionType 에 회전 따르는 것으로에서 _CollectionType , 문자열 또한 구현 에서 startIndex 및 endIndex에 실제로 인덱스의 위치를 나타내는 연산 특성 전에 첫 문자 클러스터 및 인덱스의 위치 후에 , 마지막 문자 클러스터 각각 . 따라서 문자열 "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
Xcode 6 베타 4 용으로 업데이트되었으며 메소드 변경 utf16count-> utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
또는
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
utf16count
지가있는 복잡한 문자열을 사용하면 대답 이 잘못 될 것입니다.
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 : 문자열 않으면 유니 코드 문자를 한 후 다음을 사용하여 포함하지
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 인코딩에 필요한 바이트 수를 제공합니다.
Xcode 6.1.1에서
extension String {
var length : Int { return self.utf16Count }
}
나는 brainiacs가 모든 작은 버전에서 이것을 바꿀 것이라고 생각합니다.
텍스트보기 또는 텍스트 필드에서 문자열 값을 가져옵니다.
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
}
return true
사례 도 없어야 합니까?). 답을 다시 확인하고 답을 편집 할 수 있습니까? 감사합니다!
스위프트 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
확장을 작성하여 간단히 길이를 얻을 수 있습니다.
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가 아닌 문자를 사용할 때 두 문자가 다를 수 있기 때문에주의하십시오.
예를 들어;
"你好啊hi".characters.count
5를 줄 것이지만 이것은 바이트 수는 아닙니다. 실제 바이트 수를 얻으려면해야합니다 "你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
. 이것은 당신에게 11을 줄 것입니다.