본문 바로가기

Swift/문법

(9)
Swift에서 인스턴스를 생성하는 방법들 🤨 UI 컴포넌트 인스턴스를 클로저로 생성하는 이유가 뭘까?이 글은 위 궁금증으로 시작되었습니다.앱을 개발할 때 UI컴포넌트를 사용하기 위해 ViewController에 인스턴스를 생성하는 과정이 필요했습니다.class ViewController: UIViewController { // 인스턴스 생성 후 메서드를 통해 해당 인스턴스의 속성 초기화 let label1 = UILabel() func configureUI() { label1.text = "Hello, World!" label1.textColor = .black label1.textAlignment = .center label1.font = .boldSystemF..
Swift의 타입들 Types 타입 Type타입이란 직역하면 어떤 부류의 형, 유형, 모양, 생김새 입니다.프로그래밍에서 타입은 값이 가질 수 있는 형태와 그 값에 대해 수행할 수 있는 연산을 정의하는 개념입니다.더 나누면 정적타입, 동적타입이 존재하지만 이 글에서는 다루지 않습니다 이 글에서는 Swift에서 존재하는 타입들을 살펴볼 것 입니다.더 자세한 내용은 Swift.org에 있습니다  Swift의 타입Swift의 타입은 두가지 종류가 있습니다.명명된 타입 (named type): 특정 이름을 부여할 수 있는 타입으로 클래스, 구조체, 열거형, 프로토콜, 배열, 딕셔너리, 옵셔널 모두 해당됩니다. 필요에따라 확장할 수 있습니다.복합 타입 (compound type): 정의된 이름이 없는 타입으로 함수와 튜플이 있습니다. 복합 타..
ARC dive deep ARC는 Automatic Reference Counting으로 참조타입의 참조 횟수를 자동으로 카운팅 되며 참조 수가 0이 되면 메모리에서 자동으로 해제하여 메모리 사용량을 관리합니다.자동으로 참조횟수를 트래킹 하지만, 강한 참조 사이클 같은 경우에는 각 객체가 소멸해도 강한 참조가 남아있어 메모리에 계속 유지되어 버리는 메모리 누수 현상이 발생하곤 합니다.그래서 메모리 누수 방지를 위해 weak, unowned 키워드를 종종 사용하곤 했습니다.  강한 참조 사이클 예시// 서로 참조하는 클래스 두개 생성class Person { let name: String init(name: String) { self.name = name } var apartment: Apartment? de..
후행 클로저 클로저가 아직 익숙하지 않아서 함수에서 사용된 후행클로저를 좀 자세히 알고 싶어서 작성합니다. 후행 클로저함수의 마지막 인수에 클로저 표현식을 전달해야 하고 클로저 표현식이 긴 경우 후행 클로저로 작성하면 가독성이 더 좋아집니다.func someFunctionThatTakesAClosure(closure: () -> Void) { // function body goes here}// Here's how you call this function without using a trailing closure:someFunctionThatTakesAClosure(closure: { // closure's body goes here})// Here's how you call this function wi..
enum의 다른 사용방법 Enum어떠한 객체나 UI같은 하나의 상태를 타입으로 나타낼 때 열거형(enum)을 자주 사용했었습니다.enum State { case run case walk case sleep case eat case seat}// 배열로 사용한다면..?var state = ["run", "walk", "sleep", "eat", "seat"]배열로 사용하면 인덱스 범위를 넘어가거나 올바른 문자열을 받지 못하는 사이드 이펙트를 경험하기도 했습니다.이를 열거형으로 사용하면 정해진 범위의 타입으로 지정할 수 있어서 코드 가독성과 사이드이펙트를 줄일 수 있었습니다. 오늘 알아볼 것은 이런 단순하게 상태에 대한 정의를 넘어서 더 다양한 방식들을 사용해보려고 합니다. 연관값열거형의 case는 각 상..
Swift Protocols 프로토콜(Protocols)프로토콜은 메서드, 프로퍼티, 그리고 특정 작업이나 기능의 부분이 적합한 다른 요구사항의 청사진을 정의합니다.프로토콜 안에는 선언만 하고, 구현부분에서 해당 변수나 메서드를 구현합니다.또한 여러 프로토콜을 채택할 수 있습니다.protocol Named { var fullName: String { get } func introduce()}protocol Aged { var age: Int { get }}class Human: Named, Aged { var age: Int = 10 var fullName: String = "Kim Cheol Su" func introduce() { print("hi i am \(fullName)..
Swift 구조체와 클래스 구조체와 클래스는 비슷하면서 서로 다른 성질을 갖고 있습니다.먼저 공통점으로는 다음과 같습니다.- 변수나 상수를 사용하여 값을 저장하는 프로퍼티로 정의할 수 있음- 함수를 사용하여 기능을 제공하는 메서드로 정의할 수 있음- 속성값에 접근할 수 있는 방법을 제공하는 서브스크립트를 정의할 수 있음- 객체를 원하는 초기 상태로 설정해주는 초기화 블록(init)을 정의할 수 있음- 객체에 함수적 기능을 추가하는 확장 구문을 사용할 수 있음- 특정 형식의 함수적 표준을 제공하기 위한 프로토콜을 구현할 수 있음 이와 같은 공통점이 있지만, 구조체에서는 안되지만 클래스에서는 할 수 있는 기능이 다음과 같이 있습니다.- 클래스의 특성을 다른 클래스에게 물려줄 수 없음- 실행 시 컴파일러가 클래스 인스턴스의 타입을 미리..
Swift Concurrency 정리 - Swift.org를 참고하여 작성 Swift는 구조화된 방식으로 비동기 및 병렬 코드를 작성하기위해 기본적으로 기능을 제공합니다.Swift의 언어자원을 사용하지 않고도 동시코드를 작성할 수 있지만, 읽기가 더 어렵고 복잡합니다. 사용하지 않은 예listPhotos(inGallery: "Summer Vacation") { photoNames in let sortedNames = photoNames.sorted() let name = sortedNames[0] downloadPhoto(named: name) { photo in show(photo) }}위 예제에서도 코드를 완료 핸들러로 작성해야 하기 때문에 중첩된 클로저를 사용하게 되고, 코드가 더 복잡하여 다루기 힘들..