ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift - String Method, Property (Delete)
    Programming/Swift 2021. 8. 1. 20:56

     

    오늘 String CRUD 중 D(Delete)에 대해서 공부를 해보겠습니다.

     


    remove(at:)

     

    remove(at:) 메서드는 Index의 문자를 삭제하고 리턴합니다.

    중요한 점은 삭제만 하는게 아니라 삭제한 문자를 리턴해주는 것입니다.

    헷갈리지 않아야 하는 부분은 삭제하고 남은 부분을 리턴해주는 게 아닙니다.

    원본을 삭제시키고 삭제된 문자를 리턴하는 것입니다.

     

    @discardableResult 특성이 붙으면 return 값을 사용하지 않아도 경고가 표시되지 않습니다.

    그래서 삭제만하고 리턴한 값을 사용하지 않아도 괜찮습니다.

     

    주의할 부분은 정확한 Index를 전달해야 합니다.

    만약 Index를 잘못 전달하게 되면 에러가 발생합니다.

     

     

    Index범위를 넘어가서 에러가 발생했습니다.

    마지막에 !를 삭제하기 위해서 endIndex를 사용했습니다.

    하지만 endIndex는 마지막 index가 아니라 마지막 index의 다음 인덱스죠?? 그래서 에러가 발생했습니다.

     

     

    올바른 인덱스를 이용하여 !를 삭제했습니다. 그리고 삭제된 문자를 새로운 상수에 저장했습니다.

    만약 중간 문자가 삭제된 경우에는 삭제된 부분을 뒤에 문자들이 이동해 갭을 채우게 됩니다.

     

    첫 번째 문자와 마지막 문자를 삭제할때는 위에 한 방식으로 직접 인덱스를 전달해도 되지만 미리 구현되어 있는 메서드가 존재합니다.

     

     

    removeFirst, removeLast

     

    remove(at:)과 동일하게 첫번째 문자를 삭제한 뒤 삭제한 문자를 리턴해줍니다.

    removeLast()는 마지막 문자를 삭제하는 것 말고는 다를 게 없습니다.

    주의할 점은 빈 문자열에서 사용한다면 에러가 발생하게 됩니다.

     

     

    빈 문자열에 removeFirst 메서드를 사용했더니 에러가 발생했습니다.

    removeFirst와 removeLast는 빈 문자열에서 호출되지 않도록 주의를 해야 합니다.

    그럼 올바른 코드를 보겠습니다.

     

     

    이전과 같이 직접 인덱스를 지정하지 않아도 첫 번째와 마지막 문자열을 삭제할 수 있습니다.

    다음에 볼 메서드는 파라미터가 존재하는 메서드입니다.

     

     

    removeFirst(_:), removeLast(_:)

     

    removeFirst()와 다른 점은 k를 파라미터로 받습니다.

    이 메서드는 k로 받은 수만큼 앞에서 삭제하게 됩니다.

    예를 들어 k로 3을 전달하면 앞에서 3글자를 삭제하게 됩니다.

    또 봐야 하는 부분은 이 메서드는 리턴형이 없습니다. 삭제한 문자열을 리턴하지 않고 그냥 삭제만 시킵니다.

     

    주의해야 하는 부분은 k는 0 또는 0보다 큰 정수여야 합니다. 그리고 총문자열의 개수보다 수가 적어야 합니다.

    그렇지 않으면 에러가 발생하게 됩니다.

    그럼 코드를 보겠습니다.

     

     

    0을 전달하면 아무것도 삭제하지 않은 것을 확인할 수 있습니다.

    그리고 8을 전달했더니 앞에서 8글자를 삭제했습니다.

    100을 전달했더니 남아 있는 글자는 100자보다 작죠? 그래서 에러가 발생하게 됩니다.

     

    removeLast(_:)는 뒤에서부터 전달된 파라미터만큼 삭제하는 메서드입니다.

     

     

    dropFrist(_:), dropLast(_:)

     

    removeFirst(_:)와 비슷한 dropFirst(_:)도 있습니다.

    두 메서드의 차이를 잘 알아야 합니다.

     

    가장 큰 차이점은 removeFirst(_:)는 원본을 삭제시킵니다. 그래서 메서드를 호출한 뒤에 원본을 print 해보면 원본이 변경된 것을 확인할 수 있습니다.

    반면 dropFirst(_:)는 원본을 삭제시키는 게 아닙니다.

    리턴형을 잘 보면 Substring입니다. Substring이 무엇인지 잘 모르시면 Substring 포스팅을 참고해주세요.)

    원본을 삭제시키는 게 아니라 파라미터로 전달한 숫자만큼 제외한 나머지 문자열을 Substring으로 리턴해줍니다.

     

     

    코드를 보면 원본은 변하지 않은 것을 확인할 수 있습니다.

    그리고 만약 파라미터로 문자열의 크기보다 큰 수를 전달한다면 에러가 발생하지 않고 빈 문자열을 리턴해줍니다.

     

     

    removeSubrange(_:)

     

    이번에 공부해 볼 메서드는 removeSubrange(_:) 입니다.

    이 메서드는 파라미터로 받은 범위를 삭제시킵니다. mutating이 붙어있는 거로 봐서 원본을 삭제시키는 것을 알 수 있습니다.

     

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

     

    삭제하고 싶은 range를 range(of:) 메서드를 이용해서 구한 후에 삭제를 시켰습니다.

     

     

    removeAll(keepingCapacity:)

     

    마지막으로 살펴볼 메서드는 removeAll(keepingCapacity:) 입니다.

    파라미터의 기본값은 false입니다.

    파라미터에 true를 전달하면 문자열에 할당된 스토리지는 삭제하지 않고 문자열만 삭제합니다.

    스토리지를 삭제하지 않으면 나중에 이 변수에 다시 다른 문자열을 저장할 때 최적화에 도움이 됩니다.

     

     

    우리가 보기에는 차이 없이 문자열을 모두 삭제합니다.

    하지만 내부적으로는 다르니 최적화를 위해 원하는 대로 사용하면 됩니다.

     

     


     

    참고자료

     

    https://kxcoding.com

     

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

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

    kxcoding.com

     

     

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

     

    Apple Developer Documentation

     

    developer.apple.com

     

     

     

    728x90
Designed by Tistory.