[Swift] 문자열 [1]

임승섭·2023년 7월 14일
0

Swift

목록 보기
28/35
  • 아스키코드와 유니코드

  • UTF-8, 16, 32

  • someString = "\u{유니코드스칼라값}"

  • var h1 = "\u{D55C}"						// "한"
     var h2 = "\u{1112}\u{1161}\u{11AB}"     // "ㅎ" "ㅏ" "ㄴ"
    
     h1 == h2		// true
     h1.count		// 1
     h2.count		// 1
    
  • 스위프의 문자열은 글자의 의미 단위로 사용하기 때문에, 정수 인덱스 접근이 불가능하다

  • 멀티라인 스트링 리터럴 (Multiline String Literals)

    let quotation = """
    The White Rabbit put on his spectacles.  "Where shall I begin,
    please your Majesty?" he asked.
    
    "Begin at the beginning," the King said gravely, "and go on
    till you come to the end; then stop."
    """

문자열 보간법 (String Interpolation)

  • \()

  • CustomStringConvertible : 출력 형태를 직접 구현 (프로토콜)

  • StringInterpolation : (문자열 구조체 내에 구현된 메서드)

    struct Point {
        let x: Int
        let y: Int
    }
    
    let p = Point(x: 5, y: 7)
    let q = Dog(name: "초코", weight: 90)
    
    extension String.StringInterpolation {
        mutating func appendInterpolation(_ value: Point) {
            appendInterpolation("X좌표는 \(value.x), Y좌표는 \(value.y)입니다.")
        }
    
        mutating func appendInterpolation(_ value: Dog) {
            appendInterpolation("강아지의 이름은 \(value.name), 몸무게는 \(value.weight)입니다.")
        }
    }
    
    print(p)
    print("\(p)")
    print(q)
    print("\(q)")

숫자 -> 문자열

  • 출력 형식 지정자 (Format Specifiers)

    var string: String = ""
    
    // Double 타입을 문자열로 변환 (정확하게는 타입을 변환하는게 아니고, 생성자를 이용해서 새롭게 생성하는 것)
    string = String(3.1415926)
    //print(string)
    
    string = "원하는 숫자는 " + String(format: "%.3f", pi)  // 반올림
    //print(string)
    
    string = "원하는 숫자는 " + String(format: "%.2f", pi)
    //print(string)
    
    string = String(format: "원하는 숫자는 %.2f", pi)       // %.2f 자리에 pi를 대체
    //print(string)
    
    	
    /* Format Specifiers 종류 */
    string = String(format: "%d", 7)           // %d, %D   ===> 정수
    print(string)
    
    string = String(format: "%2d", 7)          // 두자리로 표현
    print(string)
    
    string = String(format: "%02d", 7)         // 두자리로 표현하되, 0포함
    print(string)
    
    string = String(format: "%07.3f", pi)      // 일곱자리로 표현하되 0과 .(dot) 포함, (소수점아래는 3자리)
    print(string)
    
    	
    	
    var swift = "Swift"
    string = String(format: "Hello, %@", swift)       // %@  ===> 문자열
    print(string)
    
    /* 활용 */
    var firstName = "Gildong"
    var lastName = "Hong"
    
    var korean = "사용자의 이름은 %2$@ %1$@ 입니다."         // 1$ 첫번째 파라미터, 2$ 두번째 파라미터
    var english = "The username is %1$@ %2$@."
    	
    string = String(format: korean, firstName, lastName)
    print(string)
    	
    string = String(format: english, firstName, lastName)
    print(string)
  • NumberFormatter

    • 숫자 <-> 문자 변환을 다루는 클래스
    • 반올림모드(roundingMode), 최대자릿수, 최소자릿수, 숫자스타일 등등
    // 소수점 버리기
    let numberFormatter = NumberFormatter()
    numberFormatter.roundingMode = .floor         // 버림으로 지정
    numberFormatter.maximumSignificantDigits = 3  // 최대 표현하길 원하는 자릿수
    
    let value = 3.1415926
    var valueFormatted = numberFormatter.string(for: value)!    // 문자열화시키는 메서드
    print(valueFormatted)   // 3.14
    
    // 소수점 필수적 표현하기
    numberFormatter.roundingMode = .floor         // 버림으로 지정
    numberFormatter.minimumSignificantDigits = 4  // 최소 표현하길 원하는 자릿수
    
    let value2 = 3.1
    valueFormatted = numberFormatter.string(for: value2)!     // 문자열화시키는 메서드
    print(valueFormatted)     // 3.100
    
    // 세자리수마다 콤마 넣기 ⭐️
    numberFormatter.numberStyle = .decimal		// 10진수로 표현하는 방식
    let price = 10000000
    let result = numberFormatter.string(for: price)!
    print(result) // "10,000,000"

서브스트링

var greeting = "Hello, World!"

// 타입 : String.index
let index: String.index = greeting.firstIndex(of: ",") ?? greeting.endIndex	// nil coalescing

// 타입 : String.SubSequence
// -> 기존 String의 메모리 공간을 공유한다 (새로운 메모리 공간x)
let beginning: String.SubSequence = greeting[..<index>]

var word: String.SubSequence = greeting.prefix(5)	// 앞에서 5글자
var word2 = greeting.suffix(3)		// 뒤에서 3글자
// 새로운 메모리 공간을 가지는 것이 아니라, 기존 String의 메모리 주소를 가리킨다. (메모리 공간을 공유한다)


/* 그렇다면, 기존 문자열을 내가 수정하면 어떻게 되는가 */
greeting = "Happy"
// 그제서야, 새로운 메모리 공간을 만든다. -> 스위프트 내부에서 알아서 최적화
// word에는 여전히 Hello가 저장되어 있다.

0개의 댓글