👨🏻‍💻iOS 공부/iOS & Swift

    [Swift] Generics

    Generics Generic 코드는 유연하고, 재사용가능한 함수와 타입을 사용할 수 있게 하여, 어느 타입이건 작업을 수행할 수 있고, 작업자가 정의한 대로 수행할 수 있다. 이를 통해 중복을 방지하고, 의도를 명확하고 추상적으로 표현하는 코드를 작성할 수 있다. Generics는 swift가 지원하는 가장 파워풀한 기능 중 하나이다. 실제로 사용되고 있는지는 보지 못했겠지만, 자주 사용하고 있는 Array나 Dictionary 타입들은 모두 generic collection이다. Array은 Int형으로 만들 수도 있고, String 타입으로 만들 수도 있고 더 나아가 다른 타입으로도 구성할 수 있다. 유사하게 딕셔너리의 경우도 타입을 지정하고 값을 저장할 수 있으며, 그 타입에는 제한이 없다. 즉,..

    [Swift] Struct VS Class

    Struct Class type Value type (= call-by-value) Reference type (= call-by-reference) 메모리 할당 공간 Stack Heap 상속 X O deinit X O Struct enum과 같이 값 타입이다. (값의 복사가 일어난다) struct는 stack 메모리 공간에 할당된다 stack 메모리 공간은 "컴파일" 시점에 결정된다. Thread-safe 상속 불가 기본적으로는 reference count로 메모리를 관리하지 않으나, 참조를 포함하는 경우에는 reference count를 사용한다 Class 참조 타입이다. class는 heap 메모리 공간에 할당된다. heap 메모리 공간은 "런타임" 시점에 결정된다. Thread-unsafe ARC..

    [Swift] split과 components (feat. 문자열 처리)

    문자열을 다룰 때 주로 쓰는 메서드들을 살펴보자. Split(separator : ) separator를 인자로 하여 받은 값을 기준으로 대상 문자열을 나눈다. 예를 들어서 "this is a remote controller"를 " "(공백)으로 나눈다고 할 경우 ["this" "is" "a" "remote" "controller"] 를 결과로 얻게 된다. var s = "this is a remote controller" var splited = s.split(separator: " ") print(splited) // ["this" "is" "a" "remote" "controller"] 이렇게 공백을 빼고 반환해준다는게 장점이다. 하지만! [Substring]으로 반환되어 바로 사용하기에는 껄끄러운..

    [Swift] OOP의 SOLID 원칙

    객체 지향 프로그래밍이란? 먼저 작은 문제들을 해결할 수 있는 객체들을 만들고, 이 객체들을 조합하여 큰 문제를 해결하는 방식이다. 좋은 객체 지향 설계를 하게 되면 코드의 재사용, 유지보수의 용이성 등의 장점으로 가져갈 수 있고 개발 기간/비용들을 감축할 수 있다! 항상 코드는 유연하고 확장할 수 있고 유지보수가 용이하고 재사용할 수 있어야 한다. 이러한 OOP 방식을 잘 준수하기 위해 만들어진 것이 SOLID원칙이다. OOP의 SOLID 1. 단일 책임의 원칙 (SRP: Single Responsibility Principle) 하나의 객체는 하나의 책임을 가져야 한다. 즉 하나의 class가 여러 기능을 담당하면 안된다는 것이다. class Search { func searchResult() -> ..

    [Swift] 내가 보려고 정리하는 Optional

    지금껏 배웠던 다른 프로그래밍 언어들과 달리 Swift가 가지는 특색이라고도 생각하는 Optional에 대해 간략하게 정리해볼 것이다. Optional의 구조 Optional은 값이 있을 수도 있고, 없을 수 있는 타입이다. 그 내부 구조를 한 번 살펴보자. @frozen enum Optional { case none case some(Wrapped) } @frozen : enum에 더 이상 case를 추가하지 않겠다는 것을 의미 : Generic 타입이다. wrapped이라는 건 말그대로 감싸져있다는 것이기에 이후 사용시 풀어서 사용해줘야 한다. enum 구조이기 때문에 ?를 써서 사용하는 방법과는 다르게 표현할 수 있다. // 값이 있는 경우 let optionalValue: Optional = Op..

    [iOS] Firebase GoogleService-Info의 파일명 문제

    Firebase Realtime Database를 연결하기 위해서는 GoogleService-Info.plist를 다운로드 받고 프로젝트에 추가시켜야 한다. 다만 여러 프로젝트를 진행하면서 .plist들도 여러 번 다운로드 받게 되면 파일의 이름이 바뀌게 된다. 처음에 받을 때는 GoogleService-Info.plist의 파일명이겠지만, 그 이후부터는 GoogleService-Info.plist (1), GoogleService-Info.plist (2)... 이런 식으로 파일명이 중복되지 않게 생성될 것이다. 그대로 프로젝트에 추가하면 당연히 안된다! 기본적으로 AppDelegate에서 실행되는 FirebaseApp.Configure()은 GoogleService-Info.plist를 찾게된다. 하..