본문 바로가기

Swift

(22)
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는 각 상..
숫자 야구게임을 프로토콜지향 프로그래밍으로 리팩토링 해보기 숫자 야구게임을 만들어 보며.. 늘 같은 구조로 설계하는 느낌이 들어서 새로운 방법을 시도해보기 위해 최근에 공부했던 protocol을 적극 사용해서 Protocol Oriented Programming 방식으로 리팩토링 해보려고 합니다. 리팩토링하기 전엔 각 기능들을 메서드로 구현하여 클래스 안에 담았습니다.코드는 아래와 같습니다!더보기class NumberBaseballGame { private var answer: [Int] = [] private var records: [(game: Int, tryCount: Int)] = [] private var currentGameIndex = 0 private var currentState: GameState = .none { ..
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)..
비동기 프로그래밍 DispatchQueue 비동기 프로그래밍은 개발에 있어서 중요한 부분입니다.하나의 앱은 한개의 프로세스가 순차적으로 이루어지는 것이 아닌 다양한 작업이 동시다발적으로 이루어지기 때문에 이러한 작업을 효율적으로 나누고 한번에 처리하도록 설계해야합니다.설계하는데 있어서 중요한 비동기 프로그래밍에 대해서 적어보고자 합니다. 동기 / 비동기동기(Synchronous): 작업이 완료될 때까지 대기한 후, 작업이 완료되면 다음 작업을 실행비동기(Asynchronous): 작업 완료를 기다리지 않고 바로 다음 작업을 실행   직렬(serial) / 병렬(concurrent)직렬(Serial): 순차적으로 진행병렬(Concurrent): 동시에 진행 이름에서 의미를 찾아 볼 수 있지만, 직렬 병렬을 나누는 이유는 작업이 들어가는 큐에는 직렬..