Swift TIL(35)

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

Sweet & Soft, SWIFT

목록 보기
33/76

역대 이틀정도나 TIL을 못올린적은 없었는데 그 일이 일어났다. 오히려조아 오늘부터 다시시작이다 초심회복하기 좋은 날인것이 분명함

토요일 - 복습간단히 진행(필기한것 복습)
일요일 - 없슴! 노마드에서 소중한 분들과 네트워킹했다. 행복.

사실 이번주는 쉬는 주차라고 정해주신 주차라서, 조금 남아있는 예습진도를 마무리하면서 복습을 진행할 예정이다.

예습

문자열 마저 예습.

컬렉션 배울때처럼 메서드들을 많이 배우고 사용법을 익혔기 때문에 해당 메서드를 다 나열하는 건 의미가 없을 것 같고, 중요한 내용만 리마인드하는 TIL을 작성하는 걸로.

  • swift 는 대문자 소문자를 다른문자로 인식한다(유니코드 다름)

  • 문자열을 비교하는 방법중에 이런 스위프트의 특성을 이용해서 전부 대문자로 uppercased() , 혹은 전부 소문자로 lowercased() 바꿔서 비교도 가능하다

  • 공백문자열은 비어있다고 인식하지만 nil은 아니다(당연히 옵셔널도 아님) => isEmpty 속성을 써주면 true를 반환한다

  • 공백도 문자다

  • String(문자열 구조체)의 인덱스는 정수가아니다! String.index 라고 문자열인덱스라틑 별개의 타입이 존재한다. 그래서 서브스크립트 문법으로 정수를 써줄수가 없다
    예) str[0] => 아니되오

  • 배열에서처럼 인덱스를 구하고 => 서브스크립트 문법으로 해당 인덱스를 활용해서 문자에 접근하는 방식이 일반적이다

  • 인덱스를 별개로만도 뽑아낼수있지만 범위로도 뽑아낼수 있고, 내가 앞뒤 인덱스를 설정해서 범위를 만들어줄수도 있다 (당연히)

  • 문자열은 Collection 프로토콜을 따른다

  • index(인덱스, offsetBy: 간격) 정도는 기억하자
    당연히 offsetBy 에 -1도 가능하다

  • 요소를 찾는 메서드(firstIndex , lastIndex)를 사용해서 인덱스를 리턴받는경우 옵셔널일수 있어서 if let 바인딩등으로 써야할수있다

  • indices 인덱스를 하나하나 뽑아서 for문으로 돌려서 문자로 된 배열로 다시 만들수도 있다(Array생성자 혹은 map 을 사용하는 것처럼 - 직전 TIL참고 )
    indices를 해보면 실제로 rawbites가 어떤지 확인할수있다(문자열인덱스의 모양을 살짝 구경해볼수있음)

  • 범위를 벗어나지않게 인덱스를 셋팅해주는 if 문을 만들어줄수도 있다

  • range(of: ) 인덱스 범위를 리턴하는 메서드로 옵션을 추가 가능하다 단 범위추출 메서드는 옵셔널이므로 unwrapping 필수

  • 배열과 마찬가지로 삽입 insert, 대체 replace, 삭제 remove, 추가 append 가 가능하다. append 작업은 일반 기본연산자 += 나 + 로도 사용가능
    문자, 문자열 모두 가능한 작업이다.

  • 문자열의 크기를 비교한다는 것은 유니코드를 비교한다는 것, 문자열은 문자 순서대로 비교를 시작한다.

  • 대소문자 비교가 기본이지만 이를 무시하고 싶다면 compare메서드의 옵션으로 .caseInsensitive 등을 쓸수있고 caseInsessitiveCompare메서드를 사용하게 된다면 ComparisionResult타입을 리턴받아서 해당 타입에 열거형으로 이미 구현되어있는 case들을 활용해서 if문을 재작성 하거나 switch case 문으로 빼서 true/false를 반환할수 있게 하는 등 다용도로 활용가능하다

  • compare메서드의 options의 경우 CompareOptions 구조체안에 각 저장속성으로 타입이 선언되어 있어서 해당 옵션을 편하게 활용 가능한 구조이다.

  • options에 여러 값을 넣고 싶은 경우 배열로 만들어줄 수 있는데 이는 options(CompareOptions구조체)가 OptionSet프로토콜을 채택하기 때문에 가능한 로직이다.

  • 기타 비교메서드들도 다양하게 존재한다 (배열과 비교해보기)

  • 정규식에서 rawString 을 쓰는 #문법을 사용하면 좀 더 편하게 정규표현을 할 수 있다.
    정규식은 보통 range(of: 정규식, options: .regularExpression) 처럼 정규식임을 반드시 options에 표기하며 쓴다.

  • 문자열을 다듬고 제거하는 메서드들도 존재하는데 trimmingCharacters(in: )이나 components(separatedBy: ) split(whereseparator: (Character)throws -> Bool 도 가능하다
    split의 장점은 클로저 형태여서 추가 기능을 코드로 구현하면서도 문자열을 다듬을 수 있다는 것

  • 특정문자열 검색에 (제거하려면 검색하는 과정이 선행되므로) 사용하기 위해 swift 에는 CharacterSet가 이미 구현이 되어있다. rangeOfCharacter(from: )에서 해당 set를 사용할 수도 있다. range를 리턴하는 메서드의 경우 많은 경우 리턴값이 옵셔널인 듯 한데 이 메서드도 옵셔널타입이니 if let 바인딩을 해서 써야하는 것은 이해해두자.

사실 많은 부분이 직접 쓰면서 겪으면서 기억하게 될 부분이라 한번 이해하고 정리하고 넘어가는 것 만으로도 충분할 것 같다.
가장 중요하다고 생각하는 포인트는 문자열도 배열처럼 동작한다는것, 하지만 인덱스는 정수가 아닌 문자열인덱스 타입이라는 것. ComparisionResult타입, CharacterSet를 활용할 수 있다는 것, 정도이지 않을까 싶다.

모르겠고 일단 애매하면 점접근자를 찍어보는 습관을 들이자(?)

강의

너무너무너무 재밌고, 하마터면 헷갈릴뻔한 개념도 다시 짚고갈수 있었던 귀중한 시간!
상속이랑 재정의 확장도 개념을 명확히 하니까 로지컬해서 재미있다.

오늘 질문에는 잘못 대답했는데 다시 확실히 할수있어서 좋았다. 오늘 제대로 알 수 있어서 듣길잘했다. 대답하기도 잘했다잉

superclass 가 가르키고 있는 Student는 데이터영역에서의 설명임
생성하는 것을 위임하는 이유도 여기서 나온다.

확장은 메서드 추가
상속은 저장속성(데이터) 추가

생성자를 재정의하거나 확장가능하게 하지 않는 이유는 생성자가 값을 셋팅하는 역할을 하기때문이다 반대로 말하면 편의생성자처럼 가짜생성(?)자는 확장가능한 이유도 마찬가지의 논리다.

객체지향 프로그래밍
=> 메세징(다른객체의 함수를 호출가능) 객체들간의 의사소통이 가능해짐
=> 예를들어 var pet: Dog => self.pet.sit()
왕꿀잼...

오늘의 test 마지막문제

매번 테스트를 보는데, 오늘은 (사실은) 운동하고 씻느라 풀이시간이 부족했는데, 마지막 문제를 보니 시험을 제시간에는 못풀었을 듯 싶다.

마지막문제 상위 클래스의 저장속성을 계산속성으로 자유롭게 재정의 해보세요. 에서 고전했다. 문제자체를 잘못해석했다. 이것또한 부족함의 표현이라서..더 익숙해져야겠다.
그래도 풀어내니 재밌다.
+)
타입을 맞춰주는 것 중요 !

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

0개의 댓글