ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift - String Method, Property (Update)
    Programming/Swift 2021. 7. 26. 14:03

     

     

    오늘은 String CRUD 중 U(Update)에 대해서 공부해보도록 하겠습니다.

    Update의 대표적인 케이스는 추가, 삽입, 수정이 있습니다.

     


    추가하기

     

    Update에 가장 기초적인 것은 문자열에 다른 문자열을 연결시키는 것입니다.

     

     

    우리가 배웠던 문법을 이용하여 문자열을 쉽게 더하는 방법은 + 연산자를 사용하는 방법입니다.

    문자열 상수를 직접 더해도 되고 문자열 리터럴을 이용해서 더해도 됩니다.

     

    + 연산자에서 주의해야 할 부분은 중간에 공백이 추가되지 않습니다.

    그냥 + 로 더하기만 한 문자열에는 공백이 없는 점을 확인해주세요.

    공백을 넣고 싶다면 직접 추가시켜야합니다.

     

    그럼 이제 String이 제공하는 메서드를 이용하여 문자열을 더해보겠습니다.

     


     

    append(_:)

    append(_:)

    처음에 사용할 메서드는 append(_:) 메서드입니다.

    파라미터로 주어진 문자열을 이 메서드를 호출한 문자열에 추가시키는 메서드입니다.

     

    그럼 한번 사용해 보겠습니다.

     

     

    mutating member를 immutable value에 사용할 수 없다고 나옵니다.

    그냥 하던 대로 hi에 append(_:) 메서드를 사용했는데 에러가 발생했습니다.

    에러 메시지를 확인해보겠습니다.

     

    에러 메시지를 보면 mutating member (가변적인 멤버)를 immutable value (불변적인 값)에 사용할 수 없다는 메시지가 있습니다.

    이를 이해하기 위해서 append(_:) 메서드 레퍼런스의 Declaration 확인해 보겠습니다.

     

    헤더 부분을 보면 append(_:) 메서드는 리턴형이 없습니다.

    그리고 func 키워드 앞에 mutating 키워드가 붙어있습니다. (mutating에 대한 자세한 설명은 구조체를 이해해야 하므로 간단하게 넘어가겠습니다.)

    mutating func은 이 메서드를 호출한 인스턴스(우리 예제에선 hi입니다.)가 변한다는 것을 의미합니다.

    즉 append(_:)를 호출한 hi가 변해야 하는데 지금 우리는 let으로 선언했습니다.

    그래서 에러가 발생한 것입니다.

     

     

    hi를 변수 var로 선언하고 호출하니 에러가 사라졌습니다.

    그리고 append(_:)를 호출한 뒤 hi를 출력해보니 원본이 변경된 것을 확인할 수 있습니다.

    + 연산자와 마찬가지로 사이에 공백을 추가해주지는 않습니다.

    공백을 넣고 싶다면 직접 추가해야 합니다.

     


    appending(_:)

    appending(_:)

    이번에는 append(_:) 메서드와 비슷한 appending(_:) 메서드에 대해서 알아보도록 하겠습니다.

    가장 큰 차이점은  return이 있다는 점입니다.

    파라미터로 받은 문자열을 appeding(_:) 문자열에 더해서 새로운 문자열을 리턴합니다.

     

     

    append(_:) 메서드와의 차이점이 보이시나요??

    hi를 상수로 선언하고 메서드를 호출했는데 에러가 나지 않았습니다.

    그리고 appending(_:) 메서드는 새로운 문자열을 리턴하므로 새로운 상수에 저장했습니다.

    또한 원본을 변경시키지 않은 것을 확인할 수 있습니다.

     


     

    append(_:) appending(_:) 메서드의 차이

     

    이후에 계속 이러한 컨벤션을 가진 메서드를 보게 될 텐데요.

    ~ing, ~ed가 붙은 메서드는 대부분 원본을 변경하지 않고 결과를 리턴해줍니다.

    모든 게 이렇지는 않지만 거의 대부분이 지키고 있는 컨벤션이므로 기억해두시는 게 좋습니다.

     


     

    삽입하기

     

    문자열을 뒤에 붙이는 게 아니라 원하는 곳에 넣고 싶으면 insert(_:at:) 메서드를 이용합니다.

     

    insert(_:at:)

    inserted inserting이 아닌 insert입니다.

    그리고 함수 헤더를 살펴보면 mutating이 붙어있는 걸 봐서 원본을 변경하는 메서드임을 알 수 있습니다.

     

    첫 번째 파라미터에는 문자열 사이에 넣고 싶은 Character를 전달합니다.

    두 번째 파라미터에는 넣고 싶은 인덱스를 전달합니다.

    그럼 한번 사용해보도록 하겠습니다.

     

     

    이 예제에서는 두 가지 문제가 있습니다.

    첫 번째로는 insert는 원본을 변경하는 메서드인데 greeting이 let으로 선언되어있습니다.

    두 번째 문제는 at 파라미터에는 String.Index가 와야 하는데 Int를 전달했습니다.

    (String.Index에 대해서는 이전 포스팅을 참고해 주세요.)

     

     

    문제가 되는 부분을 모두 수정했습니다.

    만약 Index로 endIndex를 전달한다면 append와 같은 기능을 하게 됩니다.

     

    이번에는 교체에 대해서 공부해보겠습니다.


     

    교체하기

     

    문자열의 일부분을 다른 문자열로 바꾸는 방법에 대해서 공부해보겠습니다.

    처음 볼 메서드는 replaceSubRange(_:with:) 메서드입니다.

     

    replaceSubrange(_:with:)

    특정 범위의 텍스트를 주어진 새로운 텍스트로 변경하는 메서드입니다.

    쉽게 말해서 원하는 부분을 다른 문자열로 바꾸는 메서드입니다.

     

    함수 헤더를 보면 <C> 제네릭도 사용하고 where도 들어가서 아직은 이해하기 어렵습니다.

     

    mutating을 봐서는 원본을 바꾸는 메서드임을 알 수 있습니다. 이름도 replacing이 아닌 replace 인 것을 확인할 수 있습니다.

    첫 번째 파라미터로 Range를 받아서 두 번째 파라미터 with로 교체하는 것을 알 수 있습니다.

    그럼 바로 사용해보도록 하겠습니다.

     

     

    Hi를 Hello로 바꾸는 코드입니다.

    Hi의 인덱스를 startIndex부터 1까지 직접 지정했습니다.

    문제는 없지만 코드가 매우 길어졌습니다.

     

    원하는 문자열의 Range <String>을 쉽게 구하는 방법은 range(of:) 메서드를 활용하는 방법입니다.

    이 메서드에 대해서는 다음에 자세하게 포스팅하도록 하고 오늘은 간단히만 알아가 보도록 하겠습니다.

    range(of:) 함수는 of로 전달한 문자열을 검색하여 존재한다면 Range를 리턴해줍니다.

    하지만 존재하지 않는다면 nil을 리턴합니다.

    즉 Range?를 리턴합니다. 

    말로 설명하면 이해가 힘드니 코드를 보도록 하겠습니다.

     

     

    코드가 확실히 간단해졌죠??

    range(of:) 메서드가 optional을 리턴하므로 optional binding을 이용해서 range를 전달했습니다.

     

    이번에 공부해볼 메서드는 replacingCharacters(in:with:) 메서드입니다.

     

    replacingCharacters(in:with:)

    이 메서드는 replacing이죠??

    새로운 문자열로 대체한 문자열을 리턴해줍니다.

     

     

    다른 점은 리턴형이 있냐 없냐의 차이입니다.

    Optional binding을 이용해서 코드를 줄여보았는데요.

    이것을 모두 합한 메서드도 존재합니다.

     

    replacingOccurrences(of:with:options:ragne:)

    이 메서드는 of로 받은 문자열을 with로 받은 문자열로 대체합니다.

    options를 설정하게 되면 대소문자를 무시하고 검색하는 등 다양한 옵션을 줄 수 있습니다.

    range 파라미터는 검색을 할 범위를 지정합니다. 

     

    options와 range파라미터는 기본값을 가집니다.

    지정하지 않는다면 아무런 옵션 없이 전체 range에서 검색을 하고 존재한다면 변경하게 됩니다.

     

    그럼 이제 코드를 보도록 하겠습니다.

     

     

    range를 따로 지정하지 않고 Hi를 Hello!로 변경한 것을 확인할 수 있습니다.

    그리고 만약 변경할 문자열이 존재하지 않는다면 기존 문자열을 그대로 리턴해주는 것을 확인 할 수 있습니다.

     

    그럼 한번 option을 사용해보도록 하겠습니다.

     

     

    기본적으로 Swift는 문자열의 대소문자를 구분하죠??

    그래서 hello를 Hi!!로 변경하려고 하니 Hello는 있지만 hello는 존재하지 않아서 아무것도 변경되지 않습니다.

    이때 caseInsensitive 즉 대소문자를 무시하도록 option을 설정한다면 문자열이 변경이 되는 것을 확인할 수 있습니다.

     

     


     

    참고자료

     

    https://kxcoding.com

     

    여러분의 새로운 도전을 응원합니다 | KxCoding

    Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기

    kxcoding.com

     

     

    https://developer.apple.com/documentation/swift/string

     

    Apple Developer Documentation

     

    developer.apple.com

     

     

     

    728x90

    'Programming > Swift' 카테고리의 다른 글

    Swift - Compare String (String 비교하기)  (0) 2021.08.02
    Swift - String Method, Property (Delete)  (0) 2021.08.01
    Swift - String Method, Property (Create, Read)  (1) 2020.10.27
    Swift - SubString  (0) 2020.10.22
    Swift - String Index  (0) 2020.10.21
Designed by Tistory.