Swift TIL(34)

웰디(Well-D)·2023년 9월 22일
0

Sweet & Soft, SWIFT

목록 보기
32/76
post-custom-banner

간만에 예습을 진행했다(거의 다..는 아니고 한 일주일정도 더 하면 될듯)

예습

문자열쪽을 공부했다.

확실히 다룰 일 이, 특히 코테에서도 많이 다루는 부분이다 보니 메서드도 많고, 앗 이렇게 쓰는거였어? 싶은 부분도 있다.

특히 흥미로웠던건 저번에 알고리즘 미니 문제를 풀때 다른 언어와 다르게 스위프트에서는 string을 바로 배열처럼 쓸수없다(count등) 는 사실 을 알게되어서 Array(string)으로 배열로 타입변환하여 사용했는데(이제보니 타입변환보다 Array생성자가 정확하지만 무튼..) 이게 사실은 [Character] 타입이어서 [String]타입과는 전혀 다른 타입이라는 것이다. 물론 type alias가 가능해서 [String.Element] 타입과 [Character]타입을 같게 볼수도 있지만 어쨌든 [String] 타입은 아닌 것이었던 것. 그리고 이렇게 문자열의 요소를 나열하기 위해 배열생성자로 다시 문자열을 구현하는건 굉장히 마이너하다는 것.
(소소한 충격)
그 당시에 찾아볼때는(문자열에서 문자들을 뽑아내서 배열로 만드는 법) 더 다른 메서드들을 활용한 글을 봤었고 velog 에 정리했는데 오늘 배운 내용이 가장 정확할 것 같다.

  1. map매서드 활용(가장 메이저하게 사용)
    => 클로저 단축문법으로 우아하게 사용할수있다
    예) var someArray = someString.map {String($0)}
    --- [String]
    => 다시 문자열로 돌리고싶다면? joined()

  2. Array생성자 활용 (내가 했던 방법 - 마이너함, 제약있음) --- [Character]
    => 여기서는 그냥 String생성자 사용으로 되돌린다

  3. ARray생성자에서 arrayLiteral 멤버 생성자 활용
    예) var someArray = Array(arrayLiteral: someString) --- [String]

굳이 안써도 되는 방법을 쓰지 말고 1번을 쓰는 쪽으로 (2,3번은 알아두고 차이점도 알아두는 것은 좋은 것 같다) 해야겠다.

js를 하면서도 유니코드에 대해 많이 고민해보지 않았는데 (습관적으로 token 관련 함수등을 구현할때 쓰던 UTF-8 등) 좀 더 근본적인 부분을 알게되었다.
참고로 swift 는 UTF-32를 , 가변인코딩으로 제공한다.
가변인코딩이라는 부분도 흥미로웠고, 스위프트가 문자모음을 인식해서 문자열로 바꿔주는 부분 예를들어 ㅎ ㅓ => 허 이런식으로 컴파일 시 자동정리하여 인식해준다고 하는데 이것도 UX부분에서는 훨씬 편하지 않을까 싶은 부분이었다.

아무래도 object-C에서 시작한 언어다보니 과거 흔적이 곳곳에 남아있는데 예를들어 문자열로 String 타입(구조체) 와 NSString타입(클래스) 둘다 쓸 수 있다는 것도 그런 부분이다.
둘다 구현되어있는 속성도 달라서 String타입은 count를 NSString타입은 length를 쓰는 것도 다르다.

하지만 서로 브릿징을 지원하기 때문에 거의 같게 봐도 될 듯하다. (toll-free-bridging이라고 하는 부분인데 아직 정확히는 모르는 부분이다)

일반 NSStirng보다는 NSAtturbuteString을 더 자주 사용한다고 하는데 (링크 등에서) 앱만들면서 더 자주 접하게 될 개념일 듯 하다.

또한 Escape Character(이름이 참 직관적이다) 문자열에서 나와서(변수를 쓰기위해 등등) 사용하기 위한 다양한 키워드들이 있는데 가장 유명한 것은 \n 줄바꿈 , \" 쌍따옴표, \ 백슬래쉬 정도일 듯 하다. (사실 더 많지만 생략.. 어차피 또 찾아써야하는 부분이므로)

로우스트링도 배웠는데 간단히 말하면 #을 붙이면 가장 뒤의 #까지를 문자열 통으로 인식하고 그 안에서는 말그대로 보이는 문자열을 출력할 수 있다. 대신 Escape Character 을 쓸때도 #을 다 추가해줘야함

문자열보간법(String Interpolation)의 경우 swift 5에서 지원해주는 메서드, swift 4까지 지원했던 프로토콜 방식 둘다 아직 전부 다 이해하지 못했다(오늘 배운 부분중 가장 이해 안된 부분일 듯)

사실 swift 4까지는 내부에서 구현되어있는 protocol을 채택해서 내맘데로 구현할때 커스터마이징한다~고 생각하면 이해가 되는데, swift 5에서는 독립적인 protocol이 아니라 String 구조체 타입 그 자체에서 메서드를 구현해주었기 때문에 내가 아직 String 구조체 전체를 훑어본게 아니라 약간은 후련하게 이해가 되지 않았다.
중요한건 appendInterpolation 메서드를 구현해주었고, 그래서 이걸 요래저래 커스터마이징 해서 사용할 수 있다는 것. aapendInterpolation은 mutating 키워드를 가지고 있는데 아무래도 구조체인 String 내에서 내부속성을 바꿔주는 역할을 하기때문에 필수적으로 mutating 키워드가 들어간 듯 싶다.

NumberFormatter과 함께 사용하기도 한다고 한다. 정확히는 NumberFormatter.style에서 스타일을 case로 골라서(열거형임) 해당 스타일을 적용하는 보간법을 만든다고 생각하는 수준으로 이해했다.

다양한 스타일(format을 가진) String을 만들어 주는 방식에는
첫번째, String 구조체 생성자에서 format을 멤버로 넣어주는 생성자로 만들거나 (예를들어 String(format: "%.2f", arguments: "3.145275")
두번째, NumberFromatter()클래스 생성자로 인스턴스를 생성하고 인스턴스의 속성을 활용해서 속성내에서 포맷팅을 하는 방식이 있다.

둘다 format에는 아주 다양한 옵션들이 있는데 너무 많으니 공식문서를 참고하는 것으로 하겠습니다..

! 또 한가지
지난번 스터디원분과 스터디를 하면서 서브스트링에 대해 아주 잠깐 조사를 한 적이 있는데(이번 스터디를 하면서도 이야기를 잠깐 나누었다) 메모리공간을 공유한다는 개념, 그리고 view라는 개념만 잘 가져가면 될 것 같다.
메서드나, 서브스크립트로 문자열의 일부를 보는 등의 작업을 할때는 메모리를 공유하는 서브스트링 개념이 생긴다는 것.
하지만 원 문자열이 담겼던 변수의 값(문자열)이 나중에 바뀌거나, 새로운 생성자로 문자열을 생성하거나 하면 당연히(!) 메모리공간을 자동으로 부여해줘서 공유가 끊긴다.

보라의자 처음 허니비.sit()

profile
Wellness 잘사는 것에 진심인 웰디입니다. 여러분의 몸과 마음, 통장의 건강을 수호하고싶어요. 느리더라도, 꾸준히
post-custom-banner

0개의 댓글