8월 원티드 챌린지 - SwiftUI 공식문서 파헤치기를 듣고있다.
SwiftUI 공식문서 파헤치기 | 프리온보딩 iOS 챌린지 8월 | 원티드
무료로 양질의 교육을 들어보세요! 챌린저만을 위한 다양한 혜택을 제공해드리고 있습니다.
www.wanted.co.kr
첫 세션에서 야곰님이 하신 말씀 "공식 문서를 안읽으면 결국 남이 씹고 뱉은 것만 받아먹을 수 있다." 는 말이 마음에 크게 와닿았다.
아직 UIKit 공부가 급해 원티드에서 진행하는 SwiftUI에 더 집중하진 못하고
(죄송합니다 야곰님 ㅜㅜ 프리 온 보딩 강의는 열심히 듣고 있어요.)
제일 기본적인 Swift 문법에 관한 공식 문서부터 정리해보려고 한다.
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/
Documentation
docs.swift.org
그리고 언젠가는 최신의 정보도 혼자 꼭꼭 씹어먹을 수 있게 느리더라도 영어로 된 문서를 해석해가며 정리했다.
(맥락이 이해가 안가면 chat GPT가 친절하게 알려줬고 모르는 단어는 구글의 도움을 받았다.)
처음에는 많이 어렵겠지만 야곰님의 말씀으로는 관련 용어에 익숙해지면 공식 문서도 충분히 읽을 수 있다고 해주셨고 또 시간을 들여서라도 그렇게 해야한다고 말씀해주셨다.
스스로 해석하면서 읽는 것이라 잘못된 내용 다소 있을 수 있다.
++ 나중에는 차차 UIKit나 SwiftUI에 관한 내용도 하나씩 정리할 것이다!
The Basics
스위프트는 iOS와 관련된 앱 개발에 관한 프로그래밍 언어이다. C나 Objective-C에 경험이 있다면 많은 부분이 친숙할 수 있다.
C에 관해 아주 아주 찔끔 맛을 본적이 있는데 Swift가 훨씬 편했다. 아무래도 C언어는 로우 레벨 언어이기 때문인 것 같다.
스위프트는 정수(Int)와 실수(Double, Float), Bool(참 거짓?), 문자열(String)을 포함한 자체적인 버전의 모든 기본 C와 Objective-C 타입들을 제공한다. 또한 스위프트는 강력한 버전의 세가지 주요한 컬렉션 타입인 Array, Set, Dictionary를 제공한다.
쉽게 말해 C와 Objective-C에 쓰이던 Int와 같은 타입들을 스위프트에도 제공한다는 것 같다.
C처럼 스위프트는 변수를 식별이 되는 이름을 통해 값을 저장하고 변수를 참조하기 위해 사용한다. 또한 스위프트는 값이 변하지 않는 변수를 광대하게 사용한다. 이것은 상수로 알려져 있고 (아마 let) C의 상수보다 더 강력하다. 상수들은 스위프트에서 변하지 않는 변수에 관하여 작업할 때 코드를 더 안전하고 깔끔하게 사용하게 한다.
식별이 되는 이름을 통해서 -> 값을 저장 + 변수를 참조
친숙한 타입 외에도 스위프트에는 튜플과 같이 Objective-C에 없는 더 발전한 타입을 도입했다. 튜플은 그룹화된 값들을 만들고 전달하는 것을 가능하게 한다. 또한 튜플을 함수에서 리턴하는 다양한 값들을 하나의 혼합된 값으로 사용하는 것이 가능하다.
개인적으로 아직 앱 개발에 관한 공부가 초반이어서 그런지 튜플 보다는 열거형을 더 많이 쓰는 것 같다.
스위프트는 또한 값이 없는 옵셔널 타입을 도입했다. 옵셔널은 "값이 있고 값이 x다. 혹은 값이 전혀 없다."를 뜻한다. 옵셔널을 쓰는 것은 Objective-C에서 포인터와 함께 nil을 쓰는 것과 비슷하다. 하지만 옵셔널은 클래스 뿐만 아니라 any 타입으로도 동작한다. 옵셔널이 Objective-C의 nil 포인터보다 더 안전하고 더 많은 것을 나타낼 뿐만 아니라 스위프트의 많은 강력한 기능의 중심에 있기도 하다.
any가 any 타입을 말하는지 모든 타입을 말하는지 모르겠다. 옵셔널 타입은 정말 많이 쓰이는 것 같다. 스위프트가 제공하는 많은 함수들이 옵셔널 값으로 되어있기도 해서 guard let이나 if let을 많이 사용했다.
++ 추가적인 내용으로 Optional은 열거형이며 값이 있는 케이스를 나타내는 .some과 값이 없는 케이스를 나타내는 .none(=nil)이 있다.
그래서 NULL은 진짜로 값이 없는 상태로 가리키면 error를 유발하는데 옵셔널 값의 케이스 .none(=nil)은 값이 없는 상태(NULL)를 나타내는 상태로 가리켜도 에러가 나지 않는다.
스위프트는 type-safe 언어로, 동작하는 코드 값들의 타입이 명확할 수 있도록 도와준다. 만약 코드의 일부분이 String을 요구하면 타입 안정성이 실수로 Int로 전달하는 것을 예방한다. 이와 같은 논리로 타입 안정성은 코드의 일부분이 non-optional String을 요구할 때 실수로 옵셔널 String 값을 전달하는 것도 예방한다. 타입 안정성은 개발 단계에서 빨리 에러를 잡고 고치는데 도움을 준다.
Constants and Variables
상수와 변수는 특정한 타입의 값(숫자 10이나 문자 "Hello" 처럼)과 함께 이름(maximumNumberOfLoginAttemps or welcomeMessage 처럼) 과 연결되어있다. 변수의 값은 나중에 변할 수 있는 값이지만 상수의 값은 정해지면 변할 수 없다.
Declaring Constants and Variables
상수와 변수는 사용되기 전에 선언되어야 한다. 상수는 let 키워드로 선언하고 변수는 var 키워드로 선언한다. 여기 사용자가 만든 로그인 시도에 대한 횟수를 추적하는 것에 대해 상수와 변수가 어떻게 사용되는지에 대한 예시가 있다.
let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0
이 코드는 다음과 같이 읽을 수 있다.
"새로운 상수 maximumNumberOfLoginAttemps를 선언하고 값 10을 할당한다. 그리고 새로운 변수 currentLoginAttemps를 선언하고 초기 값 0을 할당한다."
이 예시에서 로그인 접근에 대해 허락된 최대 횟수는 상수로 선언되었다. 왜냐하면 최대 값은 절대 변하지 않기 때문이다. 현재의 로그인 접근 횟수 카운터는 변수로 선언되었다. 왜냐하면 이 값은 로그인 시도가 실패할 때마다 증가해야만 하기 때문이다.
여러 상수와 여러 변수를 ,(comma)를 사용해서 한줄로 선언할 수 있다.
var x = 0.0, y = 0.0, z = 0.0
만약 저장된 변수가 변하지 않는다면, 항상 let 키워드로 상수로 선언해라. 변수는 변함이 필요한 값을 저장할 때에만 사용해라.
Type Annotations
상수나 변수를 선언할 때 상수나 변수가 저장할 수 있는 값의 종류를 확실히 하기위해 타입을 선언할 수 있다. 타입 선언은 상수나 변수의 이름 옆에 공간을 두고 콜론을 쓰고 다시 공간을 둠으로(풀어써서 어려운데 아래 예시처럼) 쓸 수 있다.
이 예시는 변수가 String 값을 저장할 수 있다는 것을 나타내기 위해 welcomeMessage라는 변수에 대한 타입 선언을 제공한다.
var welcomeMessage: String
선언에서 콜론( : )의 의미는 타입의~ 라는 뜻이다. 그래서 위의 코드는 다음과 같이 읽을 수 있다.
String 타입인 welcomeMessage라는 변수를 선언한다.
String타입이라는 의미는 어떤 String이든 저장할 수 있다는 뜻이다.
이것은 저장될 수 있는 그것의 타입(그것의 종류)라는 의미로 생각할 수 있다.
welcomeMessage 변수는 이제 어떤 string 값이든 오류 없이 설정할 수 있다.
welcomeMessage = "Hello"
여러개의 변수들의 하나의 타입을 ,로 분리해서 마지막 변수의 이름 뒤에 한줄로 정의할 수 있다.
var red, green, blue: Double
연습으로 타입 선언이 필요한 경우는 드물다. 만약에 변수나 상수가 선언된 순간에 처음의 값을 제공한다면, Type Safety and Type Inference에 설명된 것처럼, 스위프트는 거의 항상 상수나 변수에 쓰일 타입을 추론할 수 있다. 위의 welcomeMessage예시의 경우 초기값이 주어지지 않았다. 그래서 welcomeMessage 변수의 타입이 초기값을 통한 추론이 아니라 타입 선언을 통해 특정되었다.
일단 정말 정말 앞부분까지 했다.
오 근데 생각보다 많이 오래 걸리는데?...
하지만 어디가서 공식 문서는 한번 다 읽어봤다고 확실히 말할 수 있도록 끝까지 노력해보겠다!