k-coding

Swift init() 인스턴스 초기화 본문

iOS/Swift 정리

Swift init() 인스턴스 초기화

chkhn_oiiu 2021. 10. 6. 12:35

Swift  init()  인스턴스 초기화

 

인스턴스의 저장 프로퍼티는 사용하기전에 항상 초기화가 되어야 합니다.

 

스위프트에서는 init()이라는 생성자를 사용하여, 인스턴스의 프로퍼티들마다

 

초기값을 설정하고, 새로운 인스턴스를 사용하기 전에 필요한 기본설정과 초기화를 할 수있다.

 

initoalizers 즉 init 생성자는 다음과 같이 호출 한다.

init() {
	// 초기화 코드
}

 

 

예시를 들면 이렇게 된다.

class Weather{
    var today: String = "화창"
    func display(){
        print("오늘의 날씨는 \(today)")
    }
    init(todayWeather: String){
        today = todayWeather
    }  // designated initializer : 모든 프로퍼티는 다 초기화 시킴
}
var broadcast : Weather = Weather() // 오류
//init()을 생성하면 default initializer는 사라진다.

var broadcast : Weather = Weather(todayWeather: "흐림")
broadcast.display()

 

혹은 이렇게 초기값을 비워두고 init()안에서 설정해도 무관하다.

class Weather{
    var today: String 
    func display(){
        print("오늘의 날씨는 \(today)")
    }
    init(){
        today = "화창"
    } 
}

var broadcast: Weather = Weather()
broadcast.display()

 

생성자 중첩

 

init()은 메소드와 달리 식별할 수 있는 이름을 가지지 않기 때문에

 

매개변수 명 / 타입이 각 생성자를 구별하는 역할을 한다.

 

이로 매개변수가 다른 두 생성자를 통해 여러가지 방법으로 인스턴스를 만들수 있다.

 

class Info {

  // 외부이름과 내부이름을 준 경우
  init(tall height: Double) {
      
  } 
  
  // 인자명을 지정하지 않으면 내부 이름과 동일한 외부 이름을 가진다.
  init(weight: Double) {
      
  }
  
  // 인자명을 생략하고 싶다면 '_'를 사용하면 된다.
  init(_ footSize: Int) {
      
  }
}

let info1 = Info(tall: 176.0) //initializer의 값만큼 불러와줘야한다.
let info2 = Info(weight: 70.2)
let info3 = Info(280)

 

 

self

 

초기화 선언중에 현재 클래스 내 메소드나 프로퍼티를 가리킬 때

 

메소드나 프로퍼티 앞에 self 키워드를 붙인다.

class Info {
  let tall, weight,footSize: Float
  
  init(tall:Float, weight:Float, footSize:Float){
      self.tall = tall          // 프로퍼티 = 매개변수
      self.weight = weight
      self.footSize = footSize
  }
  init(zeroSet: Float){
      tall = zeroSet
      weight = zeroSet
      footSize = zeroSet
  }
}

let info1 = Info(tall: 179, weight:71, footSize:280)
let info2 = Info(zeroSet: 0)

 

 

Optional Property Types

 

프로퍼티의 최초 값이 없고, 추후에 추가 되는 값을 옵셔널로 선언할 수 있다.

 

이러한 경우 프로퍼티는 자동적으로 nil로 초기화 된다.

 

class Info {

  let tall, weight,footSize: Float
  var age: Float?     // 옵셔널
  
  init(tall:Float, weight:Float, footSize:Float){
      self.tall = tall
      self.weight = weight
      self.footSize = footSize
  }
  init(zeroSet: Float){
      tall = zeroSet
      weight = zeroSet
      footSize = zeroSet
  }
}

let info1 = Info(tall: 179, weight:71, footSize:280)
let info2 = Info(zeroSet: 0)
info1.age = 25
print(info1.age!)

 

Failable Intializers ( 실패 가능 생성자 )  : init?

 

클래스, 구조체, 열거형에서 초기화를 실패하는 경우가 있다면

 

옵셔널 타입처럼 init뒤에 ? 를 붙이면 된다.

 

Failable Intializers는 자신이 초기화하는 타입의 옵셔널 값을 생성한다.

 

초기화 과정 중 실패할지도 모르는 부분에서 return값을 nil로 잡아준다.

 

class Info {

  let tall, weight,footSize: Float
  var age: Float?     // 옵셔널
  
  init?(tall:Float, weight:Float, footSize:Float){ // failable initialize
      self.tall = tall
      self.weight = weight
      if footSize = 0 {
      	return nil
      } else{
      	self.footSize = footSize
      }
  }
  init(zeroSet: Float){
      tall = zeroSet
      weight = zeroSet
      footSize = zeroSet
  }
}

// 옵셔널 형으로 선언후, 옵셔널 바인딩
var info: Info? = Info(tall: 179, weight:71, footSize:280)
if let info1 = info {
	...
}

// 2 인스턴스 생성과 동시에 옵셔널 바인딩
if let info2 =  Info(tall: 179, weight:71, footSize:280) {
	...
}

// 3 인스턴스 생성하면서 강제 언래핑
var info3 : Info =  Info(tall: 179, weight:71, footSize:280)!

// 4 옵셔널 인스턴스를 사용시 강제 언래핑
var info4 : Info? =  Info(tall: 179, weight:71, footSize:280)
info4!.//메소드

'iOS > Swift 정리' 카테고리의 다른 글

Swift 상속  (0) 2021.10.07
Swift 프로퍼티  (0) 2021.10.06
Swift 타입 메소드 ( static 메소드 / class 메소드 )  (0) 2021.10.06
Swift 클로저( closure )  (0) 2021.09.30
Swift 1급 객체 / 시민  (0) 2021.09.29
Comments