iOS/Swift

[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 27. 익스텐션
익스텐션 (Extension) - 익스텐션은 스위프트의 강력한 기능 중 하나 - 익스텐션은 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있는 기능 - 기능을 추가하려는 타입의 구현된 소스 코드를 알지 못하거나 볼 수 없다 해도, 타입만 알고 있다면 그 타입의 기능을 확장할 수도 있음 스위프트의 익스텐션이 타입에 추가할 수 있는 기능 - 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티 - 타입 메소드 / 인스턴스 메소드 - 이니셜라이저 - 서브스크립트 - 중첩 타입 - 특정 프로토콜을 준수할 수 있도록 기능 추가 *익스텐션은 타입에 새로운 기능을 추가할 수 있지만, 기존에 존재하는 기능을 재정의할 수는 없음 클래스의 상속 vs 익스텐션 이 둘은 비슷해보이나 실제 성격은 많이 다름 클래..
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 26. 프로토콜
프로토콜 - 프로토콜은 특정 역할을 수행하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진을 정의 - 구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 수행하기 위한 프로토콜의 요구사항을실제로 구현 가능 - 어떤 프로토콜의 요구사항을 모두 따르는 타입은 '그 프로토콜을 준수한다'고 표현 - 타입에서 프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 청사진의 기능을 모두 구현해야 함. 즉, 프로토콜은 기능을 정의하고 제시할 뿐이지 스스로 기능을 구현하진 않음 정의 protocol 프로토콜 이름 { 정의부 } 구현 - 프로퍼티 요구는 항상 var 키워드 사용 - get은 읽기 전용, set은 쓰기 전용 protocol Talkable { //프로퍼티 요구 var topic: String ..

[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 25. assert / guard
Assertion - 애플리케이션이 동작 도중에 생성하는 다양한 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 확인하고 빠르게 처리 가능. - 디버깅 모드에서만 동작 - 배포하는 애플리케이션에서는 제외 - 예상했던 조건의 검증을 위해 사용 var someInt: Int=0 //검증 조건 & 실패시 나타낼 문구 작성 , 뒤에 메세지는 안써도 됨 //검증 조건에 부합하면 지나감 assert(someInt == 0, "someIng != 0") someInt = 1 assert(someInt == 0) // int값 바꾸고 assert 실행시키면 에러 발생. 여기서 멈춰버림 assert(someInt == 0,"someInt != 0") // 뒤에 메세지를 작성한 경우 func functionWithA..
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 24. 타입 캐스팅
타입 캐스팅 - 인스턴스의 타입을 확인하는 용도 - 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도 - is, as 사용 //예제 클래스들 class Person { var name: String = "" func breath() { print("숨 쉰다!!!!!") } } class Student { var school: String = "" func goToSchool() { print("학교 쨀 사람?") } } class UniversityStudent: Student { var major: String="" func goToMT() { print("니 술 좀 묵나? 일로 와바라 ㅋㅋ") } } //인스턴스 생성 var park: Person = Person(..

[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 23. 옵셔널 체이닝과 nil 병합
옵셔널 체이닝 - 옵셔널 체이닝은 옵셔널 내부의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하게 활용 가능 - 옵셔널 내부에 옵셔널 내부에 옵셔널 ... 이런 상황에서는 계속 nil 체크를 해야할 상황이 생길 수도 있다. - 이때 옵셔널 체이닝으로 매번 nil 확인을 하지 않고 최종적으로 원하는 값이 있는지 없는지 확인할 수 있음 * 옵셔널 체이닝 사용 비교 nil 병합 연산자 - 중위 연산자. ? -> ? -> ? ... - Optional ?? Value - 옵셔널 값이 nil일 경우, 우측의 값을 반환 - 띄어쓰기 조심! 옵셔널 체이닝을 공부하면서 옵셔널이라는 개념이 모호하다는 것을 깨달았다. 스위프트에서는 옵셔널이 중요하다고 하는데 다시 확실히 짚고 넘어가야 할 것 같다... 어렵다 ..
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 22. 인스턴스 생성 / 소멸 (init / deinit)
init : 이니셜라이저. 인스턴스를 생성한다 deinit: 디이니셜라이저. 인스턴스가 소멸될 때 호출된다 프로퍼티 초기값 - 스위프트의 모든 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효한 값이 할당되어 있어야 함 - 프로퍼티에 미리 기본값을 할당해두면 인스턴스가 생성됨과 동시에 초기값을 지니게 됨 class PersonA { //모든 저장 프로퍼티에 기본값을 할당 var name: String = "unknown" var age: Int = 0 var nickName: String = "aka" } //인스턴스 생성 let jason: PersonA = PersonA() //기본값이 인스턴스가 지녀야 할 값과 맞지 않다면 (새로 지정을 해준다면) //생선된 인스턴스의 프로퍼티에 각각 값 할당 (새로..

[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 21. 상속 (클래스의 상속)
빌딩을 상속 받고 싶다 스위프트 상속 - 상속은 클래스, 프로토콜에서 가능 - 열거형, 구조체에서는 상속 불가 - 스위프트의 클래스는 단일 상속. 다중 상속을 지원하지 않음 클래스 상속 문법 //클래스 상속 문법 class 이름: 상속받을 클래스 이름 { 구현부 } 사용 - final : 재정의(override) 방지 - static : static으로 타입 메소드 만들면 재정의 불가능 - class : class로 타입 메소드 만들면 재정의 가능 - final + class : class 앞에 final을 붙이면 static 키워드를 사용한 것과 동일하게 동작. final class = static - override : 부모 클래스의 메소드 재정의

[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 20. 프로퍼티 감시자
프로퍼티 감시자 - 프로퍼티 감시자를 사용하면 프로퍼티 값이 변경될 때 원하는 동작을 수행할 수 있음 - 값 변경 전 : willSet블럭 호출 -> 암시적 매개변수인 newValue 사용 - 값 변경 후 : didSet블럭 호출 -> 암시적 매개변수인 oldValue 사용 - 둘 중 하나만 구현해도 됨 - 변경되는 값이 기존 값이랑 같아도 프로퍼티 감시자는 동작함 (값 변경으로 판단하는 게 아닌가 봄) - 연산 프로퍼티에는 사용할 수 없음 - 함수, 메소드, 클로저, 타입 등의 지역/전역 변수에 모두 사용 가능 위 코드에서 암시적 매개변수 존재를 어떻게 어떤 상황에서 쓰는지 주목하자. 그리고 willSet과 didSet이 어느 타이밍에서 어떻게 구현되는지도 주목하자.