본문 바로가기

Swift74

주니어 iOS 개발자 Swift 면접 질문 1. Swift에서 옵셔널이란 무엇인가? 옵셔널을 안전하게 다루려면 어떻게 해야 하는가?옵셔널이란 변수가 값을 가지거나, 아무런 값(nil)도 가지지 않는 Swift의 기능 var name: String? = "John" // 옵셔널 스트링name = nil // name은 nil 안전하게 다루기 위한 방법: 옵셔널 바인딩(Optional Binding), 가드문(Guard Statement), Nil-결합 연산자(Nil-Coalescing) // 옵셔널 바인딩(Optional Binding)if let unwrappedName = name { print(unwrappedName)}// 가드문(Guard Statement)func greet(_ name: String?) { guard let.. 2025. 4. 23.
Swift: add, adds, append, appends 속도 비교 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]을 배열에 더하는 연산을 다중 add, adds, 다중 append, appends로 각각 수행할 때의 속도 비교다중 add를 제외하면 평이하며, 다중 add의 경우 n이 100000000 일 때, 다른 API에 비해 3배의 속도 차이가 발생  import SwiftUIfunc measure(label: String, repeatCount: Int, function: () -> ()) { let time = ContinuousClock().measure { for _ in 1...repeatCount { function() } } print(label, ":", time)}struct ContentView: View { @State .. 2025. 3. 30.
Swift: add, append 속도 비교 n이 커질 수록 append가 속도 면에서 더 빨라지는 추세  import SwiftUIstruct ContentView: View { @State var count = 1 var body: some View { VStack { Button("count up") { count *= 10 } Button("act") { print("count:", count) DispatchQueue.global(qos: .default).async { var array1: [Int] = [] .. 2025. 3. 30.
Swift: if let, guard let 속도 비교 유의미한 차이는 없음  struct ContentView: View { @State var count = 1 var body: some View { VStack { Button("count up") { count *= 10 } Button("act") { print("count:", count) DispatchQueue.global(qos: .default).async { let time1 = ContinuousClock().measure { for _ in 1...co.. 2025. 3. 30.
Swift: async let 수행 순서 async let의 수행 순서는 await 순서에 따름func function(_ name: String, _ i: Int) async -> Int { print("sleep: ", name, i) sleep(UInt32(i)) print("wake up: ", name, i) return i}async let a = function("a", 10)async let b = function("b", 3)async let c = function("c", 2)async let d = function("d", 5)async let e = function("e", 3)async let f = function("f", 5)async let g = function("g", 3)async let .. 2025. 3. 30.
Swift Concurrency Meet async/await in Swifthttps://developer.apple.com/videos/play/wwdc2021/10132Discover concurrency in SwiftUIhttps://developer.apple.com/videos/play/wwdc2021/10019Swift concurrency: Behind the sceneshttps://developer.apple.com/videos/play/wwdc2021/10254 Meet async/await in Swift소개비동기 코드는 장황하고, 복잡하며 부정확하게 작성하기 쉬우며, 이러한 코드에 async/await이 도움이 될 수 있다.async/await을 사용하면 일반 코드를 작성하는 것처럼 쉽게 비동기 코드를 작성할 .. 2025. 2. 4.
알쓸스잡 - 8 Closure클로저는 코드에서 주변에 전달 및 사용할 수 있는 함수 블록Swift의 클로저는 다른 프로그래밍 언어에서 클로저, 익명 함수, 람다, 블록과 유사정의된 컨텍스트 내에서 모든 상수와 변수에 대한 참조를 캡처하고 저장이러한 상수와 변수를 폐쇄(closing over)라고 한다.Swift는 캡처의 모든 메모리 관리를 처리 함수 페이지에서 소개한 전역, 중첩 함수는 클로저의 특별한 케이스로 클로저는 3가지 형태 중 하나를 취한다.전역 함수는 이름을 가지고, 어떠한 값도 캡처하지 않는 클로저중첩 함수는 이름을 가지고, 둘러싼 함수로부터 값을 캡처할 수 있는 클로저클로저 표현식은 이름을 가지지 않고, 주변 컨텍스트에서 값을 캡처할 수 있는 클로저클로저 표현식은 간단하고 깔끔한 구문을 장려하는 최적화로 .. 2025. 2. 2.
알쓸스잡 - 7 가변 파라미터, Variadic Parameters함수에선 가변 파라미터라는 0개 이상의 특정 타입의 값을 허용한다.함수가 호출될 때 여러 개의 입력 값을 전달할 수 있음파라미터 타입 이름 뒤에 세 개의 간격 문자(...)를 추가하여 작성여러 개의 가변 파라미터를 가질 수 있음func sumOfArray(numbers: Int...) -> Int { numbers.reduce(0, +)}func sumOfTwoArray(numbers1: Int..., numbers2: Int...) -> Int { (numbers1 + numbers2).reduce(0, +)}print(sumOfArray(numbers: 1, 2, 3, 4, 5))print(sumOfTwoArray(numbers1: 1, 2.. 2025. 2. 1.
알쓸스잡 - 6 stridestride(from: , to: , by:)열린 범위 -> 0...5stride(from: , through: , by:)닫힌 범위 -> 0.. switch 연속 케이스fallthrough를 사용하면 C 처럼 케이스 이후 다음 케이스로 넘어감let integerToDescribe = 5var description = "The number \(integerToDescribe) is"switch integerToDescribe {case 2, 3, 5, 7, 11, 13, 17, 19: description += " a prime number, and also" fallthroughdefault: description += " an integer."}print(descriptio.. 2025. 1. 21.
알쓸스잡 - 5 스위프트의 콜렉션 타입지원하는 원시 콜렉션 타입은 3개Array, Dictionary, Set콜렉션 타입은 제네릭을 통해 구현됨집합 연산intersection: 두 집합의 공통 값을 가지는 새로운 집합을 생성symmetricDifference: 두 집합의 공통 값을 제외한 새로운 집합을 생성union: 두 집합의 모든 값으로 새로운 집합을 생성subtracting: 특정 집합의 공통 값을 제외한 새로운 집합을 생성집합 equality== : 두 집합이 같은 값을 모두 포함하고 있는지 판단isSubset: 집합이 특정 집합에 모든 값이 포함되어 있는지 판단isSuperset: 집합에 특정 집합에 모든 값을 포함 하는지 판단isStrictSubset, isStrictSuperset: 집합이 특정 집합과 같지.. 2025. 1. 17.
알쓸스잡 - 4 여러 줄 문자열 리터럴여러 줄 문자열 리터럴은 줄 바꿈을 포함만약, 문자열의 줄바꿈을 원치 않는다면 역슬래시 사용 let softWrappedQuotation = """The White Rabbit put on his spectacles. "Where shall I begin, \please your Majesty?" he asked."Begin at the beginning," the King said gravely, "and go on \till you come to the end; then stop.""""print(softWrappedQuotation)// The White Rabbit put on his spectacles. "Where shall I begin, please your Maj.. 2024. 12. 30.
알쓸스잡 - 3 나머지 연산자나머지 연산자 %는 정수에서만 사용 가능let x = 10let y = 3print(x % y)// 1 소수에서 나머지 연산을 하기 위해선 다른 연산자 사용remainder(dividingBy: )truncatingRemainder(dividingBy: )formRemainder(dividingBy: )formTruncatingRemainder(dividingBy: )let a = 10.0let b = 3.0print(a % b) // %' is unavailable: For floating point numbers use truncatingRemainder instead 튜플 비교 연산자Swift에서는 튜플 간 값 비교를 지원(1, "zebra")  튜플 간 값 비교는 최대 6개까지 지원7.. 2024. 12. 30.
알쓸스잡 - 2 Swift에서 제공하는 데이터 타입기본 데이터 타입: Int, Double, Bool, ...컬렉션 타입: Array, Set, Dictionary 플랫폼에 따른 Int플랫폼에 따라 Int의 크기가 달라짐32 bit: Int -> Int3264 bit: Int -> Int64UInt 또한 동일 Double, Float 크기Double: 64 bit 부동 소수점, 15자리의 소수점 정확도Float: 32 bit 부동 소수점, 6자리의 소수점 정확도 타입 세이프티, 타입 추론 시점타입 세이프티, 타입 추론은 컴파일 단계에서 검사 숫자 리터럴0b 접두사: 2진수0o 접두사: 8진수0x 접두사: 16진수 아래는 모두 10진수 17let decimalInteger = 17let binaryInteger = 0b1.. 2024. 12. 26.
알쓸스잡 - 1 알아두면 쓸모 있는 스위프트 잡지식 문자열 들여 쓰기큰따옴표(") 3개를 쓰는 문자열에서 들여 쓰기의 기준은 닫는 따옴표 기준let (apples, oranges) = (3, 5)let quotation1 = """ Even though there's whitespace to the left, the actual lines aren't indented. Except for this line. Double quotes (") can appear without being escaped. I still have \(apples + oranges) pieces of fruit. """//Even though there's whit.. 2024. 12. 25.
프로젝트가 프로세스가 되기까지 - 2 프로세스시작커널이 프로세스를 생성메모리 영역 할당빈 메모리 공간을 할당가상 메모리 공간 설정스택, 힙, 코드, 데이터 영역앱 실행 파일 로드dyld가 Mach-O 실행 파일을 로드하며 앱 시작dyldDynamic Link Editor의 약자macOS, iOS 운영 체제의 구성 요소앱을 사용할 수 있도록 준비  로딩 dyld가 수행하는 작업동적 프레임워크 로드시스템 프레임워크 및 종속 라이브러리(UIKit, Foundation, ...)을 메모리에 로드실행 파일, 라이브러리 내의 함수와 변수들의 심볼을 해결하고 연결참조할 수 있는 코드가 메모리에 로드symbol을 관리하고, 프로그램에서 사용할 수 있도록 담당iOS는 ASLR을 통해 메모리 배치가 매번 달라지며, 해당 주소 공간을 기준으로 포인터를 reba.. 2024. 12. 18.
프로젝트가 프로세스가 되기까지 - 1 프로젝트Xcode 빌드 시스템Xcode 빌드 시스템은 5개의 단계로 구성되어 있다.Preprocessor, 전처리기Compiler, 컴파일러Assembler, 어셈블러Linker, 링커Loader, 로더  Preprocessor, 전처리기전처리기의 목적은 컴파일러에 공급될 수 있는 방식으로 프로그램을 변환하는 것매크로를 정의로 대체종속성 발견전처리기 지시문 해결스위프트 컴파일러에는 전처리기가 없음대신 Xcode 빌드 시스템이 이를 보상(프로젝트 빌드 설정에서 전처리 조건 설정)  Compiler, 컴파일러컴파일러는 소스 프로그램을 다른 언어로 매핑하는 역할Swift 및 C family 언어를 기계어로 변환C family 언어: C/C++, Objective-C/C++Xcode는 두 개의 컴파일러를 사용S.. 2024. 12. 6.
SwiftUI + Combine MVVM 아키텍쳐 분석 - 7 TestCore Data데이터를 저장하고, 불러오는 로직에 대한 테스트init 후 empty 한지, 접근 불가능 디렉터리에 접근 가능한지, ...System시스템 기능들이 제대로 동작하는지에 대한 테스트딥 링크, life cycle, ...UtilityLoadableTests지연 가능 값과 에러 핸들링에 관한 테스트원소가 동일한지, 취소했을 때 결과, throwing, ...LazyListTestscollection에 관한 테스트empty, nil, concurrent access, ...HelpersTestslocalization에 관한 테스트RepositoryWebRepositoryTests네트워킹과 에러 핸들링에 관한 테스트ImageWebRepositoryTests이미지 불러오기에 관한 테스트suc.. 2024. 11. 11.
SwiftUI + Combine MVVM 아키텍쳐 분석 - 6 Data Access - Repository작업을 수행하는 주체네트워킹, core data작업에 필요한 정보 보유http method, api header, path, ...백그라운드 큐에서 작업, 메인 큐에서 반환web과 관련된 작업은 프로토콜 채택데이터를 불러오거나 디코딩 역할 2024. 11. 11.
SwiftUI + Combine MVVM 아키텍쳐 분석 - 5 Business Logic - Serviceprotocol 기반RealService와 StubService로 나뉨실사용과 테스트 코드용init시 appState와 repository를 받음appState를 service와 연결하지만 쓰이지 않는 경우도 있음(이전에 사용하다가 바뀌는 과정에서 제거가 누락된 듯)container를 설정할 때 init(DIContainer.Services)LodableSubject를 포함해 작업에 필요한 매개변수를 받고, repository를 통해 작업작업의 결과를 LodableSubject에 매핑작업 중에는 isLoading으로 상태 변환해 ui에서 로딩 중임을 보여줌코어 데이터를 사용해서 데이터를 저장해 두고 불러옴만약 코어 데이터에 데이터가 없다면 코어 데이터에 저장만약.. 2024. 11. 11.
SwiftUI + Combine MVVM 아키텍쳐 분석 - 4 Business Logic - AppStateDIContainer에 포함된 StateStore로 래핑 되어 있음Subject의 별칭subscript 정의로 키패스 접근 가능값 업데이트 메소드 포함typealias Store = CurrentValueSubjectUserData, ViewRouting, System, PermissionsUserData: 앱 전역적으로 쓰이는 데이터가 보관되는 구조체, CoreData로 이관됨ViewRouting: 뷰 네비게이션을 위한 구조체, 내비게이션에 사용되는 변수들은 뷰 내부에서 정의됨ex. sheet, 국가 코드, 국가 디테일을 위한 코드System: 시스템에 관한 상태를 다루는 구조체ex. 키보드가 활성화 됐을 때 높이, 뷰 라이프 사이클Permissions: 권.. 2024. 11. 11.
SwiftUI + Combine MVVM 아키텍쳐 분석 - 3 Business Logic - View Model상위 뷰에서 주입, 하위 뷰에서는 ObservedObject로 받음뷰에서 extension으로 뷰 모델 클래스 정의, ObservableObject 채택상태에 관한 변수Published 어노테이션네트워킹 등 불러오는 로직이 필요한 변수enum Loadabletypealias LoadableSubject = Binding>.notRequested, .isLoading(), .loaded(), .failed(error)case notRequestedcase isLoading(last: T?, cancelBag: CancelBag)case loaded(T)case failed(Error)init 시container, appState 연결상태에 관한 변수 bind.. 2024. 11. 11.
SwiftUI + Combine MVVM 아키텍쳐 분석 - 2 Presentation Layer - ViewUI에 관한 코드는 두 가지Screen(View), ComponentScreeninit 할 때, DIContainer라는 Environment를 주입DIContainer는 AppState와 Services를 보유상태에 따라 보여줄 화면을 switch로 분기매개 변수가 필요한 경우(에러 뷰) some View 반환 함수, 그 외의 경우 some View 저장 속성으로 표현컴포넌트상수 혹은 바인딩 멤버를 받음재시도와 같은 액션이 필요한 경우 클로저 전달다양한 init 방법프리뷰if DEBUG 전처리문으로 래핑Loadable네트워킹과 같이 불러와야 하는 작업이 필요한 요소에 채택switch 분기로 뷰 선택.notRequested, .isLoading, .loaded.. 2024. 11. 8.
Generic, Protocol Generic요구 사항에 따라 모든 타입에서 동작하는 유연하고, 재사용 가능한 함수 및 타입을 작성 가능제네릭이 해결하는 문제특정 타입에 의존하지 않고, 모든 타입에서 작동하는 범용적인 코드 작성 가능예를 들어, swapTwoInts라는 메소드는 Int라는 타입에 의존적임제네릭을 사용하면 타입 매개변수가 호출 시점에 지정한 타입으로 변환됨함수의 매개변수로 Int, String과 같은 타입이 아닌 타입 매개변수를 사용함타입 매개변수는 함수의 전달 값의 타입에서 추론됨프로토콜 정의프로토콜을 정의할 때 제네릭을 사용하고 싶다면 associatedtype 사용채택하는 측에선 typealias Protocol프로토콜은 타입특정작업 또는 기능에 적합한 메소드, 속성을 정의하는 방법클래스, 구조체, 열거형에 의해 .. 2024. 11. 7.
Data Type Class, Struct데이터를 캡슐화하기 위한 모델클래스와 구조체 공통점속성 정의(property), 기능 정의(method), 첨자 구문 정의(subscript), 초기화 구문 정의(init), 확장 가능(extension), 프로토콜관련 문서: Properties, Methods, Subscripts, Initialization, Extensions, Protocols클래스만 가진 기능상속 가능타입 캐스팅 사용으로 런타임에 클래스 인스턴스 타입 확인 및 해석deinit참조 카운팅으로 두 개 이상의 참조 허용관련 문서: Inheritance, Type Casting, Deinitialization, Automatic Reference Counting클래스와 구조체일반적으로 클래스가 지원하는 기능을 다.. 2024. 11. 7.