[Swift] Swift 기초 (1)

someng·2022년 7월 23일
0

iOS

목록 보기
1/33

1️⃣ 변수와 상수

변수(variable)는 값을 수정할 수 있고, 상수(constant)는 그렇지 않습니다.
변수는 var로 선언하고, 상수는 let으로 선언합니다.

Swift정적 타이핑 언어입니다. 즉, 변수나 상수를 정의할 때 그 자료형(타입)이 어떤 것인지를 명시해주어야 하는 언어입니다.

var name: String = "Suyeol Jeon"
let birthyear: Int = 1995
var height: Float = 180.1

📌 타입 추론 (Type Inference)

Swift 컴파일러는 큰 따옴표(")로 감싸진 텍스트는 String 타입인 것을 알고, 숫자는 Int 타입인 것을 인식할 수 있답니다 😊

📌 배열과 딕셔너리

배열과 딕셔너리는 모두 대괄호([])를 이용해서 정의할 수 있습니다.

var languages = ["Swift", "Objective-C", "Python"]
var capitals = [
  "한국": "서울",
  "일본": "도쿄",
  "중국": "베이징",
]

다른 상수와 마찬가지로 배열과 딕셔너리를 let으로 정의하면 값을 수정할 수 없습니다. 물론 값을 추가하거나 빼는 것도 불가능합니다.

위에서 정의해본 languages와 capitals의 타입은 어떻게 쓸 수 있을까요? 이번에도 대괄호를 써요. 대신, 대괄호 안에 어떤 타입을 받을 것인지를 명시합니다.

var languages: [String] = ["Swift", "Objective-C", "Python"]
var capitals: [String: String] = [
  "한국": "서울",
  "일본": "도쿄",
  "중국": "베이징",
]

빈 배열빈 딕셔너리를 정의하는 방법은 아래 두가지입니다.

var languages: [String] = []
var capitals: [String: String] = [:]

// 또는

var languages = [String]()
var capitals = [String: String]()

타입 뒤에 괄호(())를 쓰는 것은 생성자(Initializer)를 호출하는 것입니다.

2️⃣ 조건문과 반복문

if 문

  • if 문의 조건절에는 값이 정확하게 참 혹은 거짓으로 나오는 Bool 타입을 사용해야 합니다.

switch 문

  • 패턴 매칭
switch age {
case 8..<14:
  student = "초등학생"
case 14..<17:
  student = "중학생"
case 17..<20:
  student = "고등학생"
default:
  student = "기타"
}

8 ..<14 와 같이 범위 안에 age가 포함되었는지 여부를 검사할 수 있습니다.

for 문

  • for 구문을 사용해서 배열딕셔너리차례로 순환할 때에는 아래와 같이 씁니다.
for language in languages {
  print("저는 \(language) 언어를 다룰 수 있습니다.")
}

for (country, capital) in capitals {
  print("\(country)의 수도는 \(capital)입니다.")
}
  • 단순한 반복문을 만들고 싶다면 범위를 만들어서 반복시킬 수 있어요.
for i in 0..<100 {
  i
}
  • 만약 i를 사용하지 않는데 단순한 반복을 하고 싶다면, i 대신 _를 사용해서 무시할 수도 있어요.
for _ in 0..<10 {
  print("Hello!")
}

3️⃣ 옵셔널

Swift가 가지고 있는 가장 큰 특징 중 하나가 바로 옵셔널(Optional)입니다. 직역하면 '선택적인' 이라는 뜻이 되는데요. 값이 있을 수도 있고 없을 수도 있는 것을 나타냅니다.

값이 있을 수도 있고 없을 수도 있는 변수를 정의할 때에는 타입 어노테이션에 ?를 붙여야 합니다. 이렇게 정의한 변수를 바로 옵셔널이라고 하고요. 옵셔널에 초깃값을 지정하지 않으면 기본값은 nil입니다.

var email: String?
print(email) // nil

email = "devxoul@gmail.com"
print(email) // Optional("devxoul@gmail.com")

옵셔널로 정의한 변수는 옵셔널이 아닌 변수와는 다릅니다. 예를 들어, 아래와 같은 코드는 사용할 수 없습니다.

let optionalEmail: String? = "devxoul@gmail.com"
let requiredEmail: String = optionalEmail // 컴파일 에러!

requiredEmail 변수는 옵셔널이 아닌 String이기 때문에 항상 값을 가지고 있어야 합니다. 반면에, optionalEmail옵셔널로 선언된 변수이기 때문에 실제 코드가 실행되기 전까지는 값이 있는지 없는지 알 수 없습니다. 따라서 Swift 컴파일러는 안전을 위해 requiredEmail에는 옵셔널로 선언된 변수를 대입할 수 없게 만들었습니다.

        ,-- 어떤 값 (String, Int, ...)
Optional
        `-- nil

📌 옵셔널 바인딩

: 옵셔널의 값을 가져오고 싶은 경우에 사용

옵셔널의 값이 존재하는지를 검사한 뒤, 존재한다면 그 값을 다른 변수에 대입시켜줍니다. if let 또는 if var를 사용하는데요. 옵셔널의 값을 벗겨서 값이 있다면 if문 안으로 들어가고, 값이 nil이라면 그냥 통과하게 됩니다.

예를 들어, 아래의 코드에서 optionalEmail에 값이 존재한다면 email이라는 변수 안에 실제 값이 저장되고, if문 내에서 그 값을 사용할 수 있습니다. 만약 optionalEmail이 nil이라면 if문이 실행되지 않고 넘어갑니다.

if let email = optionalEmail {
  print(email) // optionalEmail의 값이 존재한다면 해당 값이 출력됩니다.
}
// optionalEmail의 값이 존재하지 않는다면 if문을 그냥 지나칩니다.
  • 하나의 if문에서 콤마(,)로 구분하여 여러 옵셔널바인딩할 수 있습니다. 이곳에 사용된 모든 옵셔널의 값이 존재해야 if문 안으로 진입합니다.
var optionalName: String? = "전수열"
var optionalEmail: String? = "devxoul@gmail.com"

if let name = optionalName, email = optionalEmail {
  // name과 email 값이 존재
}
  • 옵셔널을 바인딩할 때 ,를 사용해서 조건도 함께 지정할 수 있습니다. , 이후의 조건절은 옵셔널 바인딩이 일어난 후에 실행됩니다. 즉, 옵셔널이 벗겨진 값을 가지고 조건을 검사하게 됩니다.
var optionalAge: Int? = 22

if let age = optionalAge, age >= 20 {
  // age의 값이 존재하고, 20 이상입니다.
}

📌 옵셔널 체이닝

: 옵셔널의 속성에 접근할 때, 옵셔널 바인딩 과정을 ? 키워드로 줄여주는 역할을 합니다.

옵셔널로 선언된 어떤 배열을 떠올려봅시다. 이 배열이 '빈 배열'인지를 검사하려면 어떻게 해야 할까요? nil이 아니면서 빈 배열인지를 확인해보면 될 것입니다.

let array: [String]? = []
var isEmptyArray = false
?
if let array = array, array.isEmpty {
  isEmptyArray = true
} else {
  isEmptyArray = false
}

옵셔널 체이닝을 사용하면 이 코드를 더 간결하게 쓸 수 있습니다.

let isEmptyArray = array?.isEmpty == true

📌 옵셔널 벗기기

옵셔널을 사용할 때마다 옵셔널 바인딩을 하는 것이 가장 바람직합니다. 하지만, 개발을 하다보면 분명히 값이 존재할 것임에도 불구하고 옵셔널로 사용해야 하는 경우가 종종 있는데요. 이럴 때에는 옵셔널에 값이 있다고 가정하고 값에 바로 접근할 수 있도록 도와주는 키워드인 !를 붙여서 사용하면 됩니다.

print(optionalEmail) // Optional("devxoul@gmail.com")
print(optionalEmail!) // devxoul@gmail.com

!를 사용할 때에는 주의할 점이 있는데, 옵셔널의 값이 nil인 경우에는 런타임 에러가 발생한다는 것입니다. Java의 NullPointerException과 비슷하다고 생각하시면 될 듯 합니다.

var optionalEmail: String?
print(optionalEmail!) // 런타임 에러!

런타임 에러가 발생하면 iOS 앱은 강제로 종료(크래시)됩니다. 그러니 굉~~장히 조심해서 사용해야 해요.

📎 출처

40시간 만에 Swift로 iOS앱 만들기

profile
👩🏻‍💻 iOS Developer

0개의 댓글