티스토리 뷰

Swift

Swift ) initializer를 살펴보자

Zedd0202 2017. 7. 22. 11:06
반응형

init과 convenience init 차이점에 대한 글을 쓰면서 Swift의 이니셜라이저에대해 공부하게되었는데, 많은 사실을 알 수 있어서 정리해보려고해요 :)

모든 예제는 Swift언어 문서를 참고했어요. ㅎㅎ 변형은 제가 조금?..많이 했어요!!



Swift의  initializer




1. class 초기화 


class SurveyQuestion{

    var text: String

    init(){

        self.text = "zedd"

    }

}

var question = SurveyQuestion()

print(question.text)//"zedd"


init에 아무 파라미터를 안주고 직접 프로퍼티에 값을 줄 수 있습니다. 이 방법은 모든 클래스 인스턴스가 같은 프로퍼티 값을 가질 때 유용하겠네요. 





2. class 초기화 -2 


class SurveyQuestion{

    var text: String

    init(text: String){

        self.text = text

    }

}

var question = SurveyQuestion(text: "hello")

print(question.text)//"hello"

 init에 파라미터를 넣어 초기화 하는 방법도 있죠. 이방법을 쓰면, 넘겨주는 String에 따라서 text프로퍼티의 값이 다른 클래스 인스턴스가 생기겠죠?





3. class 초기화 - 이름이 같아도 파라미터가 다르다면!!


class SurveyQuestion{

    var text: String

    init(text: String){

        self.text = text

    }

    init(questionText: String){

        self.text = questionText

    }

}

var question = SurveyQuestion(text: "hello")

print(question.text)//"hello"

var cheeseQuestion = SurveyQuestion(questionText: "Do you like cheese?")

print(cheeseQuestion.text)//"Do you like cheese?"


파라미터의 이름이 다르죠? 그럼 똑같은 init이지만 해당 파라미터 이름이 있는 곳으로 알아서 가준답니다 :) 

또한, 


class SurveyQuestion{

    var text: String


    init(text: String){

        self.text = text

    }

    init(questionText: String){

      self.text = questionText

    }

    init(_ questionList: String){

        self.text = questionList

    }

}

var question = SurveyQuestion(text: "hello")

print(question.text)//"hello"

var cheeseQuestion = SurveyQuestion(questionText: "Do you like cheese?")

print(cheeseQuestion.text)//"Do you like cheese?"

var questionList = SurveyQuestion("Health")//init _ 있기 때문에 파라미터 이름을 안넣어도 된다. 또한, 자기에 맞는 init 무엇인지 알아서 찾아간다

print(questionList.text)//"Health"


init()안에 _ 를 해주고 파라미터 이름을 써줬죠? 이건 이 메소드를 부를 때, 파라미터 이름을 생략해도 된다는 것을 의미합니다.

그래서 저렇게 바로 "Health"를 넣어줄 수 있는 것이죠. 

하지만, 파라미터 이름을 넘겨주지 않아도 되는 init이 두개라면, 



이러한 오류가 나게 됩니다. 

하지만, 



이렇게 타입이 다르게 되면, 다른 init이라 인식하고 잘 작동하게 됩니다. 





4. 옵셔널 타입은 init에 없어도 된다.


class SurveyQuestion {

    var text: String

    var response: String?

    init(text: String) {

        self.text = text

    }

}


분명히 response라는 클래스 프로퍼티가 있지만, 모든 클래스 프로퍼티를 초기화 해야만 하는 init에 넣어주지 않아도 오류가 나지 않습니다.

response는 옵셔널 타입이기 때문이죠.

class SurveyQuestion {

    var text: String

    var response: String?

    init(text: String) {

        self.text = text

    }

}

var question = SurveyQuestion(text: "zedd")

print(question.text)//"zedd"

print(question.response)//nil

이렇게 옵셔널타입인 프로퍼티는 클래스 인스턴스가 만들어질 때, nil로 초기화된답니다. 

당연히 평범하게

class SurveyQuestion {

    var text: String

    var response: String?

    init(text: String, response: String) {

        self.text = text

        self.response = response

    }

}

이런 평범한(?) init도 가능하겠죠?ㅎㅎ


이걸 하면서 한가지 궁금했던건,  response는 옵셔널 타입인데, 왜 init할때는 String?을 넘겨주지 않고 String을 넘겨줄까?했는데, 

class SurveyQuestion {

    var text: String

    var response: String?

    init(text: String, response: String) {

        self.text = text

        self.response = response

    }

}

var a = SurveyQuestion(text: "zedd", response: "fun")

a.response = nil//가능 response 옵셔널 타입이기때문!



var a = SurveyQuestion(text: "zedd", response: nil)//error! init String으로 받기때문.




class SurveyQuestion {

    var text: String

    var response: String?

  init(text: String, response: String?) {

        self.text = text

        self.response = response

    }

}

var a = SurveyQuestion(text: "zedd", response: nil)//가능

a.response = nil//가능 response 옵셔널 타입이기때문!

뭐 당연한거겠지만...이런 소소한 차이가 있답니다 ㅎㅎ


제가 안건 이정도에요 :) Swift공부하시는데 도움이 되었으면 좋겠네요!!XD


반응형