수색…


통사론

  • String.characters // 문자열에있는 문자 배열을 반환합니다.
  • String.characters.count // 문자 수를 반환합니다.
  • String.utf8 // String.UTF8View는 문자열에서 UTF-8 문자 점을 반환합니다.
  • String.utf16 // String.UTF16View는 String에서 UTF-16 문자 포인트를 반환합니다.
  • String.unicodeScalars // String.UnicodeScalarView는 문자열에서 UTF-32 문자 포인트를 반환합니다.
  • String.isEmpty // 문자열에 텍스트가 포함되어 있지 않으면 true를 반환합니다.
  • String.hasPrefix (String) // 문자열 앞에 인수가 있으면 true를 반환합니다.
  • String.hasSuffix (String) // 문자열에 인수가 붙은 경우 true를 반환합니다.
  • String.startIndex // 문자열의 첫 번째 문자에 해당하는 인덱스를 반환합니다.
  • String.endIndex // 문자열의 마지막 문자 뒤의 자리에 해당하는 인덱스를 반환합니다.
  • String.components (separatedBy : String) // 지정된 구분 문자열로 구분 된 부분 문자열을 포함하는 배열을 반환합니다.
  • String.append (Character) // 문자열에 인자를 추가합니다.

비고

Swift의 String 은 문자 모음이며, 확장에 따라 유니 코드 스칼라 모음입니다. Swift String은 유니 코드를 기반으로하기 때문에 영어와 이모티콘 이외의 언어를 포함하여 유니 코드 스칼라 값이 될 수 있습니다.

두 스칼라가 결합되어 단일 문자를 형성 할 수 있기 때문에 문자열의 스칼라 수가 항상 문자 수와 항상 같지는 않습니다.

문자열에 대한 자세한 내용은 Swift 프로그래밍 언어문자열 구조 참조를 참조하십시오 .

구현에 대한 자세한 내용은 "신속한 문자열 디자인"

문자열 및 문자 리터럴

Swift의 문자열 리터럴은 큰 따옴표 ( " )로 구분됩니다.

let greeting = "Hello!"  // greeting's type is String

문자가 문자열 리터럴로 초기화 할 수 있습니다, 한 리터럴은 하나의 자소 클러스터를 포함로 :

let chr: Character = "H" // valid
let chr2: Character = "😊" // valid
let chr3: Character = "abc" // invalid - multiple grapheme clusters

문자열 보간법

문자열 보간법을 사용하면 표현식을 문자열 리터럴에 직접 삽입 할 수 있습니다. 문자열, 정수, 부동 소수점 숫자 등 모든 유형의 값을 사용하여이 작업을 수행 할 수 있습니다.

구문은 백 슬래시 다음에 괄호로 묶여 값 : \(value) 래핑합니다. 유효한 호출은 함수 호출을 포함하여 괄호 안에 나타날 수 있습니다.

let number = 5
let interpolatedNumber = "\(number)"  // string is "5"
let fortyTwo = "\(6 * 7)"             // string is "42"

let example = "This post has \(number) view\(number == 1 ? "" : "s")"
// It will output "This post has 5 views" for the above example.
// If the variable number had the value 1, it would output "This post has 1 view" instead.

사용자 정의 유형의 경우 문자열 보간의 기본 동작"\(myobj)"print(myobj) 와 동일한 표현 인 String(myobj) 과 동일하다는 것입니다. 사용자 유형에 맞게 CustomStringConvertible 프로토콜 을 구현하여이 동작을 사용자 정의 할 수 있습니다.

3.0

Swift 3의 경우 SE-0089 에 따라 String.init<T>(_:) 이름이 String.init<T>(describing:) 로 바뀌 었습니다.

문자열 보간 "\(myobj)" 은 새 String.init<T: LosslessStringConvertible>(_:) 초기화 프로그램을 선호하지만 값이 LosslessStringConvertible 이 아닌 경우 init<T>(describing:) 되돌아갑니다.

특수 문자

특정 문자는 문자열 리터럴에서 특수 이스케이프 시퀀스 를 사용해야합니다.

캐릭터 의미
\0 null 문자
\\ 일반 백 슬래시, \
\t 탭 문자
\v 수직 탭
\r 캐리지 리턴
\n 줄 바꿈 ( "newline")
\" 큰 따옴표 "
\' 작은 따옴표 '
\u{n} 유니 코드 코드 포인트 n (16 진수)

예:

let message = "Then he said, \"I \u{1F496} you!\""

print(message) // Then he said, "I 💖 you!"

문자열 연결

문자열을 + 연산자로 연결하여 새 문자열을 만듭니다.

let name = "John"
let surname = "Appleseed"
let fullName = name + " " + surname  // fullName is "John Appleseed"

+= 복합 대입 연산자 를 사용하거나 메소드를 사용하여 변경 가능한 문자열에 추가 :

let str2 = "there"
var instruction = "look over"
instruction += " " + str2  // instruction is now "look over there"

var instruction = "look over"
instruction.append(" " + str2)  // instruction is now "look over there"

변경 가능한 String에 단일 문자를 추가합니다.

var greeting: String = "Hello"
let exclamationMark: Character = "!"
greeting.append(exclamationMark) 
// produces a modified String (greeting) = "Hello!"

mutable 문자열에 여러 문자 추가

var alphabet:String = "my ABCs: "
alphabet.append(contentsOf: (0x61...0x7A).map(UnicodeScalar.init)
                                         .map(Character.init) )
// produces a modified string (alphabet) = "my ABCs: abcdefghijklmnopqrstuvwxyz"
3.0

appendContentsOf(_:) 이름이 append(_:) 로 변경되었습니다.

joinWithSeparator(_:) 사용하여 일련 의 문자열을 결합하여 새 문자열을 joinWithSeparator(_:) .

let words = ["apple", "orange", "banana"]
let str = words.joinWithSeparator(" & ")

print(str)   // "apple & orange & banana"
3.0

joinWithSeparator(_:)joined(separator:) 로 이름이 바뀌 었습니다.

separator 는 기본적으로 빈 문자열이므로 ["a", "b", "c"].joined() == "abc" .

문자열 검사 및 비교

문자열이 비어 있는지 확인하십시오.

if str.isEmpty {
    // do something if the string is empty
}

// If the string is empty, replace it with a fallback:
let result = str.isEmpty ? "fallback string" : str

두 개의 문자열이 같은지 확인하십시오 ( Unicode 표준과 동일 ).

"abc" == "def"          // false
"abc" == "ABC"          // false
"abc" == "abc"          // true

// "LATIN SMALL LETTER A WITH ACUTE" == "LATIN SMALL LETTER A" + "COMBINING ACUTE ACCENT"
"\u{e1}" == "a\u{301}"  // true

문자열이 다른 문자열로 시작 / 끝나는 지 확인하십시오.

"fortitude".hasPrefix("fort")      // true
"Swift Language".hasSuffix("age")  // true

문자열 인코딩 및 분해

Swift String유니 코드 코드 포인트로 구성됩니다. 여러 가지 방법으로 분해되고 인코딩 될 수 있습니다.

let str = "ที่👌①!"

문자열 분해

문자열의 characters 는 유니 코드 확장 된 제자 클러스터입니다 .

Array(str.characters)  // ["ที่", "👌", "①", "!"]

unicodeScalars 는 문자열을 구성하는 유니 코드 코드 포인트 입니다 ( ที่ 은 하나의 grapheme 클러스터이지만 3 개의 코드 포인트 - 3607, 3637, 3656 - 결과 배열의 길이는 characters 와 같지 않습니다).

str.unicodeScalars.map{ $0.value }  // [3607, 3637, 3656, 128076, 9312, 33]

문자열을 UTF-8 ( UInt8 시퀀스) 또는 UTF-16 ( UInt16 시퀀스)으로 인코딩하고 분해 할 수 있습니다.

Array(str.utf8)   // [224, 184, 151, 224, 184, 181, 224, 185, 136, 240, 159, 145, 140, 226, 145, 160, 33]
Array(str.utf16)  // [3607, 3637, 3656, 55357, 56396, 9312, 33]

문자열 길이 및 반복

문자열의 charactersunicodeScalars , utf8utf16 은 모두 Collection 이므로 count 가져 와서 반복 할 수 있습니다.

// NOTE: These operations are NOT necessarily fast/cheap! 

str.characters.count     // 4
str.unicodeScalars.count // 6
str.utf8.count           // 17
str.utf16.count          // 7
for c in str.characters { // ...
for u in str.unicodeScalars { // ...
for byte in str.utf8 { // ...
for byte in str.utf16 { // ...

유니 코드

설정 값

유니 코드 직접 사용

var str: String = "I want to visit 北京, Москва, मुंबई, القاهرة, and 서울시. 😊"
var character: Character = "🌍"

16 진수 값 사용

var str: String = "\u{61}\u{5927}\u{1F34E}\u{3C0}" // a大🍎π
var character: Character = "\u{65}\u{301}" // é = "e" + accent mark

Swift Character 는 여러 유니 코드 코드 포인트로 구성 될 수 있지만 단일 문자로 보입니다. 이것을 Extended Grapheme Cluster라고합니다.

전환 수

문자열 -> 16 진수

// Accesses views of different Unicode encodings of `str`
str.utf8
str.utf16
str.unicodeScalars // UTF-32

Hex -> String

let value0: UInt8 = 0x61
let value1: UInt16 = 0x5927
let value2: UInt32 = 0x1F34E

let string0 = String(UnicodeScalar(value0)) // a
let string1 = String(UnicodeScalar(value1)) // 大
let string2 = String(UnicodeScalar(value2)) // 🍎

// convert hex array to String
let myHexArray = [0x43, 0x61, 0x74, 0x203C, 0x1F431] // an Int array
var myString = ""
for hexValue in myHexArray {
    myString.append(UnicodeScalar(hexValue))
}
print(myString) // Cat‼🐱

UTF-8 및 UTF-16의 경우 이모티콘 같은 것이 단일 UTF-16 값으로 인코딩 될 수 없으므로 변환이 항상 쉽지는 않습니다. 서로 게이트 쌍을 취합니다.

반전 문자열

2.2
let aString = "This is a test string."

// first, reverse the String's characters 
let reversedCharacters = aString.characters.reverse()

// then convert back to a String with the String() initializer
let reversedString = String(reversedCharacters)

print(reversedString) // ".gnirts tset a si sihT"
3.0
let reversedCharacters = aString.characters.reversed()
let reversedString = String(reversedCharacters)

대문자와 소문자 문자열

String의 모든 문자를 대문자 또는 소문자로 만들려면 :

2.2
let text = "AaBbCc"
let uppercase = text.uppercaseString // "AABBCC"
let lowercase = text.lowercaseString // "aabbcc"
3.0
let text = "AaBbCc"
let uppercase = text.uppercased() // "AABBCC"
let lowercase = text.lowercased() // "aabbcc"

문자열에 정의 된 집합의 문자가 포함되어 있는지 확인

편지

3.0
let letters = CharacterSet.letters

let phrase = "Test case"
let range = phrase.rangeOfCharacter(from: letters)

// range will be nil if no letters is found
if let test = range {
   print("letters found")
}
else {
   print("letters not found")
}
2.2
let letters = NSCharacterSet.letterCharacterSet()

let phrase = "Test case"
let range = phrase.rangeOfCharacterFromSet(letters)

// range will be nil if no letters is found
if let test = range {
   print("letters found")
}
else {
  print("letters not found")
}

Objective-C NSCharacterSet 클래스에도 연결되어있는 새로운 CharacterSet 구조체는 다음과 같이 미리 정의 된 여러 집합을 정의합니다.

  • decimalDigits
  • capitalizedLetters
  • alphanumerics
  • controlCharacters
  • illegalCharacters
  • NSCharacterSet 참조에서 더 많이 찾을 수 있습니다.

또한 자신 만의 문자 세트를 정의 할 수 있습니다.

3.0
let phrase = "Test case"
let charset = CharacterSet(charactersIn: "t")

if let _ = phrase.rangeOfCharacter(from: charset, options: .caseInsensitive) {
   print("yes") 
}
else {
   print("no")
}
2.2
let charset = NSCharacterSet(charactersInString: "t")

if let _ = phrase.rangeOfCharacterFromSet(charset, options: .CaseInsensitiveSearch, range: nil) {
   print("yes")
}
else {
    print("no")
}

범위를 포함 할 수도 있습니다.

3.0
let phrase = "Test case"
let charset = CharacterSet(charactersIn: "t")

if let _ = phrase.rangeOfCharacter(from: charset, options: .caseInsensitive, range: phrase.startIndex..<phrase.endIndex)) {
   print("yes") 
}
else {
   print("no")
}

문자열에있는 문자의 발생 수 계산

주어진 StringCharacter

let text = "Hello World"
let char: Character = "o"

우리는 CharacterString 나타나는 횟수를 세 어서 계산할 수 있습니다.

let sensitiveCount = text.characters.filter { $0 == char }.count // case-sensitive
let insensitiveCount = text.lowercaseString.characters.filter { $0 == Character(String(char).lowercaseString) } // case-insensitive

세트에 정의되지 않은 문자열에서 문자 제거

2.2
func removeCharactersNotInSetFromText(text: String, set: Set<Character>) -> String {
   return String(text.characters.filter { set.contains( $0) })
}

let text = "Swift 3.0 Come Out"
var chars = Set([Character]("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ".characters))
let newText = removeCharactersNotInSetFromText(text, set: chars) // "SwiftComeOut"
3.0
func removeCharactersNotInSetFromText(text: String, set: Set<Character>) -> String {
  return String(text.characters.filter { set.contains( $0) })
}

let text = "Swift 3.0 Come Out"
var chars = Set([Character]("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ".characters))
let newText = removeCharactersNotInSetFromText(text: text, set: chars)

문자열 서식 지정

선행 0

let number: Int = 7
let str1 = String(format: "%03d", number) // 007
let str2 = String(format: "%05d", number) // 00007

10 진수 이후의 숫자

let number: Float = 3.14159
let str1 = String(format: "%.2f", number) // 3.14
let str2 = String(format: "%.4f", number) // 3.1416 (rounded)

십진수를 16 진수로

let number: Int = 13627
let str1 = String(format: "%2X", number) // 353B
let str2 = String(format: "%2x", number) // 353b (notice the lowercase b)

또는 동일한 작업을 수행하는 특별한 초기화 프로그램을 사용할 수도 있습니다.

let number: Int = 13627
let str1 = String(number, radix: 16, uppercase: true) //353B
let str2 = String(number, radix: 16) // 353b

임의의 기수가있는 숫자에 대한 소수

let number: Int = 13627
let str1 = String(number, radix: 36) // aij

기수는 [2, 36] 에서 Int 입니다.

빠른 문자열을 숫자 형식으로 변환

Int("123") // Returns 123 of Int type
Int("abcd") // Returns nil
Int("10") // Returns 10 of Int type
Int("10", radix: 2) // Returns 2 of Int type
Double("1.5") // Returns 1.5 of Double type
Double("abcd") // Returns nil

이 작업을 수행하면 Optional 값이 반환되므로 사용하기 전에 언 래핑 해야합니다.

문자열 반복

3.0
let string = "My fantastic string"
var index = string.startIndex

while index != string.endIndex {
    print(string[index])
    index = index.successor()
}

참고 : endIndex 는 문자열 끝에옵니다 (예 : string[string.endIndex] 는 오류이지만 string[string.startIndex] 은 괜찮습니다). 또한 빈 문자열 ( "" )에서 string.startIndex == string.endIndextrue 입니다. 빈 문자열에 대해서는 startIndex.successor() 를 호출 할 수 없으므로 빈 문자열을 확인하십시오.

3.0

Swift 3에서는 문자열 인덱스가 successor() , predecessor() , advancedBy(_:) , advancedBy(_:limit:) 또는 distanceTo(_:) 더 이상 갖지 않습니다.

대신 이러한 작업은 컬렉션으로 이동되며 이제 컬렉션의 인덱스가 증가하거나 감소합니다.

사용할 수있는 메서드는 .index(after:) , .index(before:).index(_:, offsetBy:) 입니다.

let string = "My fantastic string"
var currentIndex = string.startIndex

while currentIndex != string.endIndex {
    print(string[currentIndex])
    currentIndex = string.index(after: currentIndex)
}

참고 : .index 메소드와의 혼동을 피하기 위해 currentIndex 를 변수 이름으로 사용하고 있습니다.

예를 들어, 다른 방향으로 가고 싶다면 :

3.0
var index:String.Index? = string.endIndex.predecessor()

while index != nil {
    print(string[index!])
    if index != string.startIndex {
        index = index.predecessor()
    }
    else {
        index = nil
    }
}

(또는 문자열을 먼저 뒤집을 수는 있지만 문자열을 끝까지 갈 필요가없는 경우이 방법을 선호 할 것입니다.)

3.0
var currentIndex: String.Index? = string.index(before: string.endIndex)

while currentIndex != nil {
    print(string[currentIndex!])
    if currentIndex != string.startIndex {
        currentIndex = string.index(before: currentIndex!)
    }
    else {
        currentIndex = nil
    }
}

Index 는 객체 유형이며 Int 아닙니다. 다음과 같이 문자열의 문자에 액세스 할 수 없습니다.

let string = "My string"
string[2] // can't do this
string.characters[2] // and also can't do this

그러나 다음과 같이 특정 색인을 얻을 수 있습니다.

3.0
index = string.startIndex.advanceBy(2)
3.0
currentIndex = string.index(string.startIndex, offsetBy: 2)

다음과 같이 뒤로 이동할 수 있습니다.

3.0
index = string.endIndex.advancedBy(-2)
3.0
currentIndex = string.index(string.endIndex, offsetBy: -2)

문자열의 범위를 초과하거나 제한을 지정하려는 경우 다음을 사용할 수 있습니다.

3.0
index = string.startIndex.advanceBy(20, limit: string.endIndex)
3.0
currentIndex = string.index(string.startIndex, offsetBy: 20, limitedBy: string.endIndex)

다른 방법으로 문자열의 문자를 반복 할 수 있지만 상황에 따라 덜 유용 할 수 있습니다.

for c in string.characters {
    print(c)
}

선행 및 후행 WhiteSpace 및 NewLine 제거

3.0
let someString = "  Swift Language  \n"
let trimmedString = someString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
// "Swift Language"

메서드 stringByTrimmingCharactersInSet 은 지정된 문자 집합에 포함 된 String 문자의 양쪽 끝을 제거하여 만든 새 문자열을 반환합니다.

공백이나 개행 만 제거 할 수도 있습니다.

공백 만 제거 :

let trimmedWhiteSpace = someString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
// "Swift Language  \n"

개행 만 지우기 :

let trimmedNewLine = someString.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
// "  Swift Language  "
3.0
let someString = "  Swift Language  \n"

let trimmedString = someString.trimmingCharacters(in: .whitespacesAndNewlines)
// "Swift Language"

let trimmedWhiteSpace = someString.trimmingCharacters(in: .whitespaces)
// "Swift Language  \n"

let trimmedNewLine = someString.trimmingCharacters(in: .newlines)
// "  Swift Language  "

참고 :이 모든 방법은 Foundation 속합니다. Foundation이 Cocoa 나 UIKit 같은 다른 라이브러리를 통해 아직 가져 import Foundation 되지 않은 경우 import Foundation 사용하십시오.

문자열을 Data / NSData와 변환

String과 Data / NSData를 변환하려면이 문자열을 특정 인코딩으로 인코딩해야합니다. 가장 유명한 것은 ASCII 기반 시스템에 의한 전송 또는 저장에 적합한 유니 코드 문자의 8 비트 표현 인 UTF-8 입니다. 다음은 사용 가능한 모든 String Encodings 목록입니다.

String to Data / NSData

3.0
let data = string.data(using: .utf8)
2.2
let data = string.dataUsingEncoding(NSUTF8StringEncoding)

String Data / NSData

3.0
let string = String(data: data, encoding: .utf8)
2.2
let string = String(data: data, encoding: NSUTF8StringEncoding)

문자열을 배열로 분할하기

Swift에서는 문자열을 특정 문자로 분리하여 문자열을 배열로 쉽게 분리 할 수 ​​있습니다.

3.0
let startDate = "23:51"

let startDateAsArray = startDate.components(separatedBy: ":") // ["23", "51"]`
2.2
let startDate = "23:51"

let startArray = startDate.componentsSeparatedByString(":") // ["23", "51"]`

또는 구분 기호가 없을 때 :

3.0
let myText = "MyText"

let myTextArray = myText.components(separatedBy: " ") // myTextArray is ["MyText"]
2.2
let myText = "MyText"

let myTextArray = myText.componentsSeparatedByString(" ") // myTextArray is ["MyText"]


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow