Swift TIL(57)

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

Sweet & Soft, SWIFT

목록 보기
55/76

예습+복습(본습)

눈물의 완강파티
이렇게 강의를 완강하는게 쉽지않다니..그래도 완강해서 기쁘다. 최대한 집중력을 끌올하려고 노력했는데 잘되지 않아서(특히 명절이후+스위프트행사 후부터) 각종 책도 읽고, 영상도 읽고, 열심히 이것저것 적용해보았는데..역시 뭐니뭐니해도 그냥 일단 해야할걸 하는게 심신건강에도 최고다.

사실은 이제 시작이다(그래도 찰나는 기쁘게 해주세요)

오늘 배운 부분은 사실 실제 앱만들기를 많이 진행해보면 더 자주 들여다보고 익숙해지고, 다시 보러 오게 될 것 같다.

가볍게 정리

주요 프로토콜

  • Equatable => 상속 Comparable, Hashable

  • Equatable 구조체 열거형의 경우 프로토콜 채택시 저장속성, 연관값이 Equatable 할때는 연산자 == 타입메서드를 자동구현해줌 / 연관값이 없는 열거형은 채택없이도 자동구현해줌 / 클래스는 채택 후 타입메서드로 구현 필수

  • Comparable 열거형의 경우 원시값 없다면(연관값 있어도) 프로토콜 채택만 하면 < 연산자 타입메서드 자동구현 / 구조체, 클래스의 경우 프로토콜 채택 후 구현 필수 / Comparable 채택 시 Equatable 자동상속으로 구현 필수(이는 Equatable 원칙을 따른다 / 즉 클래스는 필수구현, 열거형과 구조체는 경우에 따라 자동구현되기도 함)

  • Hashable hashable하다라는 것은 Dictionary key로 쓸수 있다는 것, Set의 요소로 쓸 수 있다는 것 / 구현하기 func hash(into hasher: inout Hasher){hasher.combine(속성)} / Equatable과 비슷한 원칙으로 동작한다 ( 클래스는 필수구현, 열거형 구조체는 프로토콜 채택 시 저장속성이나 연관값이 Hashable하면 자동구현 / 연관값없는 열거형은 채택없이도 자동구현) / 마찬가지고 Equatable을 상속하므로 클래스는 무조건 == 타입메서드 필수구현해줘야함

  • 구조체를 Hashable 하게 해주면 구조체의 인스턴스들을 set의 요소로 넣어쓰는 등의 행위가 가능하다

  • CaseIterable 프로토콜 : Enum타입에서 사용가능 / 프로토콜을 채택시 allCases라는 타입속성(열거형의 모든 케이스를 배열로 담아 리턴함)이 생긴다(계산속성)
    => for 문으로 사용시 편리, 선언하여 할당하기 편리함, 배열로 활용할때의 장점(케이스 개수세기, 고차함수, 랜덤케이스 추출) 등으로 활용가능

Never타입(런타임 오류)

  • Never타입 제어권을 리턴하지 않는 (실행 후 원래 코드의 위치로 돌아가지 않는) 타입임 / 동시성과 약간은 유사, 반대되는 개념인게 동시성은 비동기의 경우 제어권을 먼저 리턴하는 것이다

  • Never타입은 빈 열거형으로 당연히 인스턴스 생성이 안된다(열거형에 케이스가 있어야 인스턴스 생성이 되는데) 런타이중 발생가능한 에러를 검증, 테스트하기위한 용도

  • Never타입을 리턴하는 경우 => 함수내에서 앱 종료(문제 발생가능성 있는 곳에 fatalError, assert, precondition 메서드 삽입/ 해당 메서드들은 앱을 종료시킴/ 해당 메서드들의 리턴타입이 Never) / 에러처리코드로 제어권 전달(do try catch 등)

  • 디버그 모드에서만 활성화 assert()=> 참거짓 판단 파라미터 => false일때 앱종료, message띄움 / assertFailure() => 거짓 condition에서만 사용, 앱종료와 message띄움

  • 디버그, release모드에서만 활성화 precondition()=> 참거짓 판단 파라미터로 false일때 앱종료 message띄움 / preconditionFailure() => 거짓 condition에서만 사용 앱종료와 message띄움 / 업데이트 확인 여부 등 앱 출시 후 사용

  • 디버그, release, 베타 모드에서 모두 활성화 fatalError() => 무조건 종료, 잘안씀

  • 서버다운등의 개선 불가한 런타임 오류는 앞서 배운 Error처리 => 앱꺼짐 방지를 통해 검증,해결

키패스와 셀렉터

  • keyPath : 속성을 간접접근하는 방법
    (swift 5이후)
    \Person.graduate.honeybee.name keyPath표현식으로 설정 + 서브스크립트로 해당 경로 접근 person[keyPath:namePath]
    (swift 5이전)
    NSObject 채택 및 @objc키워드, value(forKey:) 혹은 value(forKeyPath: ) 메서드 사용, 사용시 타입캐스팅 으로 다소 복잡
  • selector : 메서드의 주소를 저장하고 접근하는 방법(메서드실행 아님 주의) / 구조체는 사용불가(클래스, obj-c 프로토콜 멤버만 가능)
    #selector(getter: )
    #selector(setter: )
    #selector()
    등으로 선언(Selector타입됨) + selector로 저장할 메서드, 계산속성에는 @objc 키워드 추가
    => 코드주소를 전달해서, 어떤 행위를 했을때 바로 해당 코드가 실행되게끔 할 수 있다(버튼 하드코딩)

메타타입

  • 타입인스턴스(타입.self 혹은 type(of:인스턴스))의 타입

  • 타입인스턴스란 데이터영역의 타입속성이 있는 메모리저장공간을 의미

  • 타입(프로토콜 제외).Type 혹은 프로토콜.Protocol 과 같이 표기

  • Int.max => 사실은 Int.self.max(타입인스턴스의 max타입속성접근)

  • typealias AnyClass =AnyObject.Type기억하기

  • 메타타입을 사용한다는 것 => 인스턴스가 아닌 타입자체(타입인스턴스)가 필요한 경우

availability

  • @available 키워드 : 타입,속성,메서드 앞에 사용하여 컴파일러에게 정보제공
  • #available 키워드 : 조건문에 사용하여 조건문 스코프 내 코드 실행여부를 결정
  • @available(ios 17.0, *) 등으로 사용가능


늘 먹던걸로 주쇼

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

0개의 댓글