상세 컨텐츠

본문 제목

[Swift] 첫 시작과 계기, 기초

Mobile

by Yoonsang's Log 2022. 1. 1. 17:25

본문

React Native로 iOS Share Extension(외부에서 공유하기)를 이용해 다른 앱에서 우리 앱으로 공유하게 하는 기능을 추가하기 위해 react-native-share-menu 라는 npm모듈을 이용해 적용하였다.

다른건 잘 되는데!

일부 앱(네이버, 핀터레스트 등)에서 제목이나 내용과 URL을 같이 내보내는 경우 앞에 text만 인식해서 URL을 무시하고 버려 버린다. 분명 배열같은 형태로 받아서 첫번째 아이템만 받아오는거니까 방식을 바꿔서 URL을 인식하게 하면 될 것 같은데.. Swift 소스를 보니 참 이래 저래 해봐도 안되네 안돼...

그래서 직접 Swift를 공부해서 이슈를 해결해보려고 한다.

 

Swift

iOS, macOS, watchOS 및 tvOS Application을 개발하기 위한 언어로 Apple에서 만든 언어이다.

C, objective-C의 단점들을 상당 부분 개선하고 다른 언어들의 장점들도 많이 포함되어 편리하게 공부하고 개발할 수 있는 언어이다.

Apple에서 많은 지원이 있고 밀고 있는 언어라고 한다! 즉, 공부할 가치가 있다!

 

상수 및 변수(Constants and Variables)

다른 언어와 마찬가지로 상수는 변경할 수 없는 값, 변수는 추후에 다른 값으로 변경할 값을 설정할 수 있다.

* let : 상수 선언

* var : 변수 선언

JavaScript의 const, let, var을 생각하면 헷갈릴 수 있을 것 같다.

Swift의 let 은 상수 선언이다!

 

타입 주석 (Type Annotation)

상수 또는 변수를 선언할 때 이름 뒤에 타입을 나타낼 수 있다. (타입스크립트처럼)

var greetMsg: String = "안녕하세요."

출력 및 주석(Print, Comment)

상수 또는 변수를 print를 통해 나타낼 수 있다. \(변수 혹은 상수명) 을 통해 문자열 내부에 변수 혹은 상수를 나타낼 수 있다.

C언어와 마찬가지로 // 또는 /* ~~ */ 로 주석을 달 수 있다.

print(greetMsg) // 안녕하세요.
print("한국어로 인사는, \(greetMsg) 입니다.") // 한국어로 인사는, 안녕하세요. 입니다.

 

세미콜론 (;)

Swift는 문장 뒤에 세미콜론을 쓰는것이 필수가 아니다. 한 라인에 여러 명령이 있을 경우 세미콜론으로 구별할 수 있다.

 

정수(Integer)

8,16,32,64 비트 형식의 부호가 있거나 없는 정수를 제공한다.

8비트 정수의 최댓값 최소값에 접근하는 방법 : UInt8.min / UInt8.max

대부분의 코드에서 특정 정수의 크기를 지정해줄 필요가 없다.

-> 32비트 플랫폼에서 Int는 Int32, 64비트 플랫폼에서 Int는 Int64에 해당

* 32비트 플랫폼 Int에서도 약 -21억 ~ 21억 사이의 모든 값을 저장할 수 있다.

+) UInt 로 부호가 없는 정수인 Unsigned integer 를 사용할 수 있다. 

 

부동 소수점(Floating-Point Numbers)

Floating-Point Numbers는 소수를 나타낼 수 있다.(0.1123123, 1.23123, 3.14159, ..)

* Double - 64bit  / Float - 32bit

 

타입 안정성 및 추론(Type Safety and Type Inference)

변수 및 상수 그리고 함수 등에 타입을 나타내어 컴파일 과정 이전에 개발자의 실수와 여러 오류를 피할 수 있다. (안전한 언어)

타입스크립트는 반드시 타입을 뒤에 나타내야 하지만 Swift는 자동으로 추론하기도 한다.

let age = 24 // age 상수를 Int 형으로 추론한다.
let pi = 3.14159 // pi 상수를 Double 형으로 추론한다. (Float 보다는 Double로 추론함)

 

숫자 리터럴(Numeric Literals)

정수 리터럴 :

* prefix가 없는 10진수(decimal) -> let decimal = 17

* prefix '0b'가 붙는 2진수(binary) -> let binary = 0b10001

* prefix '0o'가 붙는 8진수(octal) -> let octal = 0o21

* prefix '0x'가 붙는 16진수(hexadecimal) -> let hexadecimal = 0x11

부동 소수점 리터럴 :

* prefix가 없는 10진수 -> 1.25e2 -> 1.25 * 10^2 -> 125.0

* prefix가 있는 16진수 -> 0xFp2 -> 15* 2^2 -> 60.0

+) 숫자가 큰 경우(e.g. 1,000,000,000) 컴파일에 문제가 없이 단위를 잘라서 나타내는 것처럼 나타낼 수 있다.

let bigNum = 1_000_000_000

 

숫자 타입 변환 (Numeric Type Conversion)

정수 변환

정수에 저장할 수 있는 숫자의 범위는 유형에 따라 다르다. (e.g Int8은 -128 ~ 127, UInt8은 0~255)

let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(One) // UInt16으로 형변환!

정수 및 부동 소수점 변환

let pi = 3.14159
let integerPi = Int(pi) // 3

 

타입 별칭(Type Aliases)

typealias 키워드로 타입 별칭을 정의한다. (C언어에서 #define 으로 long long int를 llint로 별칭했던 것 처럼)

typealias AudioSample = UInt16

var minAudioSample = AudioSample.min // 0

 

부울 (Booleans)

true or false !!

let isFirstSwift = true
if isFirstSwift {
	print("Study with me !!")
   }
else {
	print("Wow.. I want to be like you!")
   }
// -> Study with me !!

 

튜플 (Tuples)

튜플은 여러 값을 single compound value(단일 복합 값)으로 그룹화 한다.

let http404Error = (404, "Not Found")

위의 예를 따르면 HTTP 상태코드를 두개의 타입이 있는 값으로 얻을 수 있다. 

 

옵셔널 (Optional)

값이 있을수도 없을 수도 있는 상황에 사용한다.

let possibleNum = "123"
let convertedNumber = Int(possibleNum) // Int or optional Int

타입 변환이 실패할 수도 있으므로 optional Int 를 대신 반환한다. optional Int 는 Int?,not 으로 표기된다.

-> Int 값이 포함되었거나 전혀 포함되지 않을 수 있다. 

+) Bool 값이나 String 값은 아무것도 포함하지 않을 수도 있다.

또한 nil이라는 특별한 값을 할당하여 optional 변수를 값이 없는 상태로 설정할 수 있다. 

var serverStatusCode: Int? = 404
serverStatusCode = nil // optional로 된 변수에는 아무것도 없는 상태를 설정할 수 있다.

Optional 변수의 디폴트 값은 nil이다. 즉 아무것도 지정하지 않으면 nil이 되는것이다.

* 강제 언래핑

if문을 사용해서 옵셔널을 비교해서 nil값이 포함되어 있는지 확인할 수 있다.

if convertedNum != nil {
	print("convertedNum 옵셔널 변수는 int형 값을 가지고 있다.")
}

옵셔널에 값이 있다고 확신할 수 있다면 이름 끝에 ! 를 추가해서 강제적으로 기본 값을 나타낼 수 있다.

if convertedNum != nil {
	print("convertedNum 옵셔널 변수는 int형 값을 가지고 있다. 그 값은 \(convertedNum!)이다.")

존재하지 않는 값에 강제 언래핑을 했다면 런타임 에러가 뜰 것이다. 옵셔널에 nil 이 아닌 값이 있는지 반드시 확인하고 강제 언래핑을 하자.

* 옵셔널 바인딩

옵셔널에 값이 포함되어 있는지 확인하고 값이 있다면 해당 값을 임시 상수나 변수로 사용할 수 있도록 한다.

옵셔널 바인딩을 if 나 while 문과 함께 사용해서 옵셔널 값을 확인하고 해당 값을 상수나 변수로 추출할 수 있다.

let possibleNum = "123"
if let actualNum = Int(possibleNum) {
	print("The string \"\(possibleNum)\" has an integer value of \(actualNum)")
 } else {
 	print("The string \"\(possibleNum)\" couldn't be converted to an integer")
    
 // The string "123" has an integer value of 123 이 출력된다!

 

어설션 및 프리컨디션(Assertions and Preconditions)

런타임에 발생하는 검사이다. 추가 코드를 실행하기 전에 필수 조건이 충족되었는지 확인한다.

어설션은 디버그 빌드에서만 확인되고 개발자의 실수 및 잘못된 코드를 개발 중에 찾는데에 도움이 되고 

프리컨디션은 프로덕션 빌드와 디버그 빌드 모두에서 확인되고 프로덕션에서 문제를 발견하는데에 도움이 된다.

즉, 프로덕션 성능에 영향을 주지 않고 개발 중에 원하는 만큼 어설션을 사용할 수 있다.

let age = -3
assert(age >=0, "사람의 나이는 0살보다 어려질 수 없습니다.")

assert(age>=0)// 메시지 생략 가능

코드에서 이미 조건을 확인 한 경우 assertionFailure 함수를 사용해서 어설션이 실패했음을 나타낼 수 있다.

if age > 10 {
	print("롤러코스터 탑승 가능")
 }else if age >=0 {
 	print("관람차 탑승 가능")
 }else {
 	assertionFailure("사람의 나이는 0살보다 어릴 수 없습니다.")
 }

 

+) 프리컨디션. 조건이 거짓일 가능성이 있을 때마다 프리컨디션을 사용할 수 있지만 코드가 계속 실행되게 하려면 반드시 참이 되어야 하는 경우에 사용해야 한다.

 

자료출처

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID309

 

The Basics — The Swift Programming Language (Swift 5.5)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

 

'Mobile' 카테고리의 다른 글

[Swift] 함수  (0) 2022.01.01
[Swift] 제어 흐름  (0) 2022.01.01
[Swift] 컬렉션 유형  (0) 2022.01.01
[Swift] 문자 및 문자열  (0) 2022.01.01
[Swift] 기본 연산자  (0) 2022.01.01

관련글 더보기

댓글 영역