본문 바로가기

ios

13. iOS 초기화 공부

이 내용은 챗 지피티와 아래의 블로그를 사용해서 공부한 것입니다!

https://babbab2.tistory.com/168

 

Swift) 초기화(Initializers) 이해하기 (2/6) - 클래스의 초기화(Designated / Convenience)

안녕하세요 :) 코들입니다.. 코로나에 걸려 죽다 살아 돌아온 소들이라 볼 수 있습니다 아직도 마지막 잎새마냥 기침하며 포스팅 적는 중.. ...뭐야 위 세 줄 쓴 뒤로 3주지남.. 진짜 죽었었나.. 쨌

babbab2.tistory.com

클래스의 초기화

1. 클래스를 초기화하는 방법

  • 클래스 초기화 시점에 모든 프로퍼티들은 기본 값을 가지고 있어야한다. 기본값 없으면 인스턴스 생성 실패
    • 선언과 동시에 프로퍼티에 기본값 넣어주기
    • 프로퍼티 타입을 옵셔널타입의 변수로 설정하기
      • let은 안됨
    • 생성자 안에서 프로퍼티의 값을 설정해주기
  • 구조체는 프로퍼티에 기본값이 없어도 에러가 안난다.
    • 구조체는 초기화되지 않은 프로퍼티를 초기화 시킬 수 있도록 자동으로 제공하는 생성자인 Memberwixe Initializers가 있다.

 

2. 클래스의 initializers

class Human {
    let name: String
    
    init(name: String) {
        self.name = name
    }
}
 
class Sodeul: Human {
    let alias: String
    
    init(alias: String) {// error! 'super.init' isn't called on all paths before returning from initializer
        self.alias = alias
    }
}
  • Designated Initializers(지정 생성자)
    • 해당 생성자 메서드가 종료 될때 까지 모든 프로퍼티는 초기값을 지니고 있어야한다.
    • 반드시 super.class의 생성자를 호출해야한다.
      • 자식 클래스에서 지정생성자에 self.init()만 넣으면 부모 클래스에서 기본값이 없는 프로퍼티가 있을 때 에러가 나기 때문에 이를 방지하기 위해 super.init()을 넣는다.
class Sodeul {
    var name: String
    var nickName: String
    
    init(name: String, nickName: String) {
        self.name = name
        self.nickName = nickName
    }
    
    convenience init(name: String) {
        self.init(name: name, nickName: "unknown")
    }
}
  • Convenience Initializers( 편의 생성자)
    • 모든 프로퍼티를 초기화할 필요 없는 생성자이다.
    • 반드시 다른 초기화를 호출시켜야한다.
    • 슈퍼 클래스의 생성자는 호출 시킬 수 없다.
    • 같은 클래스내에 있는 Convenience Initializers나 Designated Initializers를 호출 시켜야 한다.
    • 최종적으로는 같은 클래스 내의 Designated Initializers가 호출되어야 한다.
    • 따라서 Convenience init을 사용하려면 Designated initailizers가 구현되어 있어야함.
    • 최종적으로 Convenience initializers에서 Designated Initializers를 호출하지 않으면 에러난다.
    • self' used before self.init call or assignment to 'self'
      • self.name = a 와 같이 프로퍼티를 바꿔 주는 것은 다른 생성자를 부르고 바꿔야함 
      • 다른 초기화를 부르기전에 값을 설정하면 다른 초기화에 의해 값이 덮어지는 문제가 발생할 수

'ios' 카테고리의 다른 글

storekit 공부하기  (0) 2024.12.06
15. URLRequest  (0) 2024.04.16
12. Clean Architecture (iOS)  (0) 2023.12.24
11. 동기화 공부하기  (0) 2023.12.13
10. ios의 frame과 bounds  (0) 2023.12.11