iOS/문법 14

Property Observer

Property Observer의 뜻은 프로퍼티를 감시한다 라는 의미이다. Stored Property(저장 프로퍼티)에서만 사용이 가능하다. willSet - 값이 저장되기 직전에 호출 didSet - 값이 저장된 직후 호출 willSet willSet 옵저버라고 부른다. 새로운 값이 상수 매개변수로 전달된다. 매개변수 이름을 직접 지정할 수 있지만, 직접 지정 하지 않는 경우 newValue라는 매개변수를 통해 전달된다. didSet 이전 프로퍼티 값을 포함하는 상수 매개변수가 전달된다. 매개변수 이름을 직접 지정할 수 있고, 지정하지 않는 경우 oldValue라는 매개변수를 통해 사용할 수 있다. 위에서 저장 프로퍼티에서만 프로퍼티 옵저버를 사용할 수 있다고 했지만 연산 프로퍼티에서도 조건을 만족되..

iOS/문법 2023.02.11

Property

Property 종류 Stored Property (저장 프로퍼티) Computed Property (연산 프로퍼티) Type Property (타입 프로퍼티) Stored Property (저장 프로퍼티) 상수(constant) 혹은 변수(variable) 값을 인스턴스 일부로 저장한다. (클래스, 구조체에서 사용) var: 변수 let: 상수 간단하죠..? Computed Property (연산 프로퍼티) 연산 프로퍼티는 저장 프로퍼티와 다르게 저장을 하기 위한 목적의 프로퍼티가 아닌 연산을 하기 위한 프로퍼티이다. (말장난 느낌이네..;) 예를 들어 보면 class Test{ var a = 1 var x = { get{ return a } set{ a = newValue * 2 } } } var t..

iOS/문법 2023.02.11

Swift 문법과 친해지기 - MRC/MMR(Objective-C 잔재)

제목에서 보다시피 MRC/MMR은 과거 Objective-C에서 사용하던 메모리 관리 기법이다. ARC의 RC는 Reference Counting이지만 MRC의 RC는 Retain Counting이라고 한다. 소들이 님의 블로그를 보고 이해한 결과 TestClass *test = [[TestClass alloc] init]; 라고 선언을 하면 alloc을 통해 힙 영역에 자동적으로 할당이 되고 Retain Count는 1 증가한다. 그 후 TestClass *test2 = test; test2에 test 주소값을 복사하는 경우 Retain Count이 증가하지 않는다.!!!! 이런 것 때문에 수동 메모리 관리 기법이라고 한다.. Retain Count를 올려주기 위해 TestClass *test2 = t..

iOS/문법 2023.01.07

Swift 문법과 친해지기 - Strong, Weak, unowned, 순환 참조

Strong - 강한 참조 강한 참조는 인스턴스가 할당되고 RC가 증가하면 강한 참조라고 한다. default값이 강한 참조로 구성된다고 한다. 순환 참조 ARC의 단점으로 '순환 참조가 발생될 경우 영구적으로 메모리가 해제되지 않을 수 있다'가 있다. □ 순환 참조 예시 1 class Man { var name: String var girlfriend: Woman? init(name: String) { self.name = name } deinit { print("Man Deinit!") } } class Woman { var name: String var boyfriend: Man? init(name: String) { self.name = name } deinit { print("Woman Dein..

iOS/문법 2023.01.07

Swift 문법과 친해지기 - ARC(Automatic Reference Counting)

우리가 Swift를 사용할 때 인스턴스 클로저 등의 참조타입은 자동적으로 힙에 할당되어 사용되었다. class Human { var name: String? var age: Int? init(name: String?, age: Int?) { self.name = name self.age = age } } let sodeul = Human(name: "sodeul", age: 26) Human이라는 클래스를 우리가 인스턴스를 생성하고 초기화했을 때 다음과 같이 할당된다. 스택 영역에 먼저 지역 변수가 할당되고 실질적인 Human 클래스의 인스턴스들은 힙영역에 할당되게 된다. 스택 영역에 있는 지역 변수에는 힙영역의 인스턴스들의 주소값이 저장된다. 다른 언어에서 참조값을 다루어 보았다면 알다시피 다른 변수에..

iOS/문법 2023.01.07

Swift 문법과 친해지기 - 패턴

Swift 패턴에는 크게 두 가지가 존재한다. 어떤 종류의 값과 일치하는 패턴 어떤 종류의 값과 일치하지 않는 패턴 2가지 종류의 패턴들은 또 여러 가지 패턴으로 구분되어 있다. 어떤 종류의 값과 일치하는 패턴 와일드카드 패턴 식별자 패턴 값 바인딩 패턴 튜플 패턴 어떤 종류의 값과 일치하지 않는 패턴 열거형 케이스 패턴 옵셔널 패턴 타입 캐스팅 패턴 표현 패턴 어떤 종류의 값과 일치하는 패턴 단순 상수, 변수 및 옵셔널 바인딩에서 값을 소멸시키는 데 사용된다. 어노테이션을 지정하여 특정 유형과 일치하도록 제한을 둘 수 있다. 와일드카드 패턴 와일드카드 패턴은 모든 값을 일치시키고 무시하며 밑줄(_)로 구성된다. □ 와일드카드 패턴 예시 let hello = ("안녕","hi") switch hello{..

iOS/문법 2023.01.06

Swift 문법과 친해지기 - 제네릭

제네릭 타입에 의존하지 않는 범용 코드를 작성할 때 사용 제네릭 방법으로 코드를 작성하는 경우 같은 내용의 함수를 오버로딩할 필요 없이 한 번만 작성하여 사용할 수 있다. 제네릭 타입 제네릭은 함수뿐만 아니라 구조체, 클래스, 열거형 타입에도 선언하여 사용할 수 있다. 제네릭을 선언할 때 를 사용하여 선언한다. 제네릭을 이미 우리는 알게 모르게 사용했었다..! let array: Array = .init() swift에서는 배열이 바로 제네릭으로 구현되어 있다! 타입 제약 프로토콜 제약 만약 매개변수 2개를 받아서 반환하는 함수를 만들었을 때 func isSameValues(_ a: T, _ b: T) -> Bool { return a == b } 해당 함수는 오류를 발생시킨다. → 반환할 때 '=='연..

iOS/문법 2023.01.06

Swift 문법과 친해지기 - protocol

프로토콜 구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있다. 스스로 기능을 구현하지 않는다. 하나의 타입으로 사용되기 때문에 다음과 같은 타입에서 사용가능 하다. 함수, 메소드, 이니셜라이저의 파라미터 타입, 상수, 변수, 프로퍼티 타입, 배열, 딕셔너리 원소 타입 간단히 말해 프로토콜은 해당 기능에 필요한 요구사항을 선언해두는 것이다. 다른 언어들의 인터페이스와 비슷한 개념 같다. □ 프로토콜 예시 protocol Band{ var drum: String {get set} var vocal: String {get set} var piano: String {get set} var guitar: String {get set} func pl..

iOS/문법 2023.01.04

Swift 문법과 친해지기 - Type Casting 와 Any, AnyObject

is is 연산자는 타입을 확인하는 연산자로 반환 값은 Bool 타입이다. □ 예시 class Human {} class Teacher: Human {} class Animal {} let teacher: Teacher = .init() teacher is Teacher// true teacher is Human//true teacher is Animal//false → is는 영어 문법 같은 느낌인 것 같다. → 해당 변수의 타입이 is 뒤에 오는 타입인 경우 true, 아닌 경우 false를 반환한다. as as 는 어떤 해당 Type으로 변경시킬 수 있는 문법 표현식이다. as를 사용하면 UpCasting, DownCasting을 사용하는데 UpCasting 업캐스팅은 예시를 들어서 살펴보면 조금 ..

iOS/문법 2023.01.04

Swift 문법과 친해지기 - Subscript

subscript 서브스크립트는 우리가 배열을 사용할 때 배열 속 원소에 접근하기 위해 사용하는 대괄호 []를 지칭한다. □ 배열 서브스크립트 정의 → index를 int타입으로 받고 Element를 반환한다. □ 딕셔너리 서브스크립트 정의 → key값을 input으로 받고 Value를 반환한다. 이를 이용해 서브스크립트를 입맛에 맞게 변형할 수 있다 서브스크립트 정의하기 subscript(index: Int) -> Int { get { } set(newValue) { } } → subscript 키워드로 작성하고 1개 이상의 매개변수 값과 반환 값을 지정 (생략 불가) → getter 혼자 사용은 가능 하지만, setter는 혼자 사용이 불가능하다. □ 배열 서브스크립트 사용해보기 let str = "..

iOS/문법 2022.12.31