티스토리 뷰
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
'Swift' 카테고리의 다른 글
Swift3 ) 왕초보를 위한 JSON Parsing - 2(JSON 가져오기) (3) | 2017.07.27 |
---|---|
JSONSerialization / jsonObject (0) | 2017.07.27 |
Swift ) init과 convenience init의 차이 (5) | 2017.07.20 |
Swift3 ) 왕초보를 위한 날짜와 시간(Date)사용해보기 (1/2) (0) | 2017.07.14 |
Swift3 ) How to convert Array/Dictionary/Set to String in Swift(배열/집합/사전을 문자열로 바꾸는 방법) (0) | 2017.07.13 |
- actor
- swift sort
- 피아노
- WKWebView
- swift 공부
- np-complete
- np-hard
- IOS
- github
- swift3
- swift delegate
- Accessibility
- WidgetKit
- Combine
- 스위프트 문법
- WWDC
- FLUTTER
- SwiftUI
- 회고
- swift array
- Xcode
- ios 13
- fastlane
- UIBezierPath
- 제이슨 파싱
- iOS delegate
- 스위프트
- swift tutorial
- Git
- Swift
- Total
- Today
- Yesterday