[Swift] iOS 개발을 위한 스위프트 기초, 빠르게 배우기

스위프트의 기능과 구문을 살펴보고, 스위프트의 기초를 다져보자.
Apr 15, 2024
[Swift] iOS 개발을 위한 스위프트 기초, 빠르게 배우기

A Swift Tour

print("Hello, World!")
// Hello, World!를 출력합니다
  • 텍스트 출력이나 문자열 처리와 같은 기능을 위해 별도의 라이브러리를 가져올 필요가 없다.

  • 전역 범위에서 작성된 코드는 프로그램의 시작점으로 사용되므로 main() 함수가 필요하지 않다.

  • 모든 문 끝에 세미콜론을 작성할 필요도 없다.

Simple Values

상수를 만들려면 let을 사용하고 변수를 만들려면 var를 사용합니다. 상수의 값은 컴파일 시점에 알 필요는 없지만 정확히 한 번만 값을 할당해야 합니다. 즉, 상수를 사용하여 한 번 결정하지만 여러 곳에서 사용하는 값의 이름을 지정할 수 있습니다.

var myVariable = 42
myVariable = 50
let myConstant = 42

상수나 변수는 할당하려는 값과 동일한 유형을 가져야 합니다. 하지만 항상 유형을 명시적으로 작성할 필요는 없습니다. 상수나 변수를 생성할 때 값을 제공하면 컴파일러가 그 유형을 유추할 수 있습니다. 위 예제에서 컴파일러는 초기값이 정수이므로 myVariable이 정수라고 추론합니다.

초기값이 충분한 정보를 제공하지 않거나 초기값이 없는 경우 변수 뒤에 콜론으로 구분하여 유형을 지정합니다.

let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70

값은 암시적으로 다른 유형으로 변환되지 않습니다. 값을 다른 유형으로 변환해야 하는 경우 원하는 유형의 인스턴스를 명시적으로 만들어야 합니다.

let label = "The width is "
let width = 94
let widthLabel = label + String(width)

따로 찾아본 내용!

Python은 동적 타이핑 언어로 변수의 타입이 실행시간(runtime)에 결정된다. 변수를 선언할 때 타입을 명시할 필요가 없다. 단순히 값을 할당함으로써 동적으로 타입이 결정된다.

Swift나 Kotlin은 정적 타이핑 언어이지만 타입 추론을 지원한다. 변수의 타입을 명시하지 않아도 컴파일러가 초기화 값 등을 기반으로 변수의 타입을 추론할 수 있다.

문자열에 값을 포함하는 더 간단한 방법이 있습니다: 괄호 안에 값을 쓰고 괄호 앞에 백슬래시(\)를 넣으면 됩니다. 예를 들어

let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

여러 줄을 차지하는 문자열에는 큰따옴표(""") 세 개를 사용합니다. 따옴표로 묶은 각 줄의 시작 부분의 들여쓰기는 닫는 따옴표의 들여쓰기와 일치하는 한 제거됩니다. 예를 들어

let quotation = """
        나는 지금 스위프트 언어를 배우고 있다.
        문법이랑 개발을 같이 배우면 좋을 것 같다는 생각을 했다.
        I still have \(apples + oranges) pieces of fruit.
        """

괄호([])를 사용하여 배열과 사전을 만들고, 괄호 안에 인덱스나 키를 적어 그 요소에 액세스합니다. 마지막 요소 뒤에는 쉼표가 허용됩니다. 요소를 추가하면 배열이 자동으로 커집니다.

var fruits = ["strawberries", "limes", "tangerines"]
fruits[1] = "grapes"


var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
 ]
occupations["Jayne"] = "Public Relations"

fruits.append("blueberries")
print(fruits)

// Prints "["strawberries", "grapes", "tangerines", "blueberries"]"

// 파이썬/스위프트는 인덱스가 0부터 시작, 코틀린/자바는 1부터 시작

대괄호를 사용하여 빈 배열이나 딕셔너리를 작성할 수도 있습니다. 배열의 경우 [], 딕셔너리의 경우 [:]를 씁니다.

fruits = []
occupations = [:]

빈 배열이나 딕셔너리를 새로운 변수 또는 유형 정보가 없는 다른 위치에 할당하는 경우 유형을 지정해야 합니다.

let emptyArray: [String] = []
let emptyDictionary: [String: Float] = [:]

Control Flow

조건문을 만들려면 ifswitch를 사용하고, 루프를 만들려면 for-in, whilerepeat-while을 사용합니다. 조건 또는 루프 변수 주위의 괄호는 선택 사항입니다. 본문 주위에 중괄호는 필수입니다.

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0

for score in individualScores {
    // 본문 내부의 조건의 괄호는 선택 사항
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}

print(teamScore)
// Prints "11"

if 문에서 조건은 부울 표현식이어야 합니다. 즉, if score { ... }와 같은 코드는 0에 대한 암시적 비교가 아니라 오류입니다.

조건에 따라 값을 선택하려면 대입의 등호(=) 뒤 또는 반환 뒤에 if 또는 switch를 작성할 수 있습니다.

let scoreDecoration = if teamScore > 10 {
    "🎉"
} else {
    ""
}
print("Score:", teamScore, scoreDecoration)
// Prints "Score: 11 🎉"

누락될 수 있는 값으로 작업할 때 iflet을 함께 사용할 수 있습니다. 이러한 값은 옵션으로 표시됩니다. 선택적 값(An optional value)은 값을 포함하거나 nil을 포함하여 값이 누락되었음을 나타냅니다. 값의 유형 뒤에 물음표(?)를 붙여 값을 선택 사항으로 표시합니다.

var optionalString: String? = "Hello"
print(optionalString == nil)
// Prints "false"


var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}

선택적 값이 nil이면 조건은 거짓이 되고 중괄호 안의 코드는 건너뜁니다. 그렇지 않으면 선택적 값이 래핑 해제되고 let 뒤에 상수에 할당되어 코드 블록 내에서 래핑 해제된 값을 사용할 수 있게 됩니다.

선택적 값을 처리하는 또 다른 방법?? 연산자를 사용하여 기본값을 제공하는 것입니다. 선택적 값이 누락된 경우 기본값이 대신 사용됩니다.

더 짧은 철자를 사용하여 값을 래핑 해제할 수 있으며, 래핑 해제된 값에 동일한 이름을 사용할 수 있습니다.

let nickname: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickname ?? fullName)"

if let nickname {
    print("Hey, \(nickname)")
}
// nickname이 nil이므로 아무것도 출력하지 않는다.

switch는 모든 종류의 데이터와 다양한 비교 연산을 지원하며, 정수 및 동일성 테스트에만 국한되지 않습니다.

let vegetable = "red pepper"
switch vegetable {
case "celery":
    print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
    print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
    print("Is it a spicy \(x)?")
default:
    print("Everything tastes good in soup.")
}
// Prints "Is it a spicy red pepper?"

패턴에서 let을 사용하여 패턴과 일치하는 값을 상수에 할당하는 방법에 주목하세요.

일치하는 switch 케이스 내부의 코드를 실행한 후 프로그램은 스위치 문에서 종료됩니다. 실행이 다음 케이스로 계속되지 않으므로 각 케이스의 코드 끝에서 명시적으로 switch에서 벗어날 필요가 없습니다.

for-in을 사용하면 각 키-값 쌍에 사용할 이름 쌍을 제공하여 사전의 항목을 반복할 수 있습니다. 사전은 순서가 정해지지 않은 컬렉션이므로 키와 값이 임의의 순서로 반복됩니다.

조건이 변경될 때까지 코드 블록을 반복하려면 while을 사용합니다. 대신 루프의 조건이 마지막에 위치하여 루프가 한 번 이상 실행되도록 할 수 있습니다.

// n < 0 처럼 조건이 이미 거짓인 경우는 2가 그대로 출력됨
var n = 2
while n < 100 {
    n *= 2
}
print(n)
// Prints "128"

// m < 0 처럼 조건이 이미 거짓인 경우는 4가 출력됨
var m = 2
repeat {
    m *= 2
} while m < 100
print(m)
// Prints "128"

..<를 사용하여 인덱스 범위를 만들면 인덱스를 루프에 유지할 수 있습니다. 상위 값을 생략하는 범위를 만들려면 ..<을 사용하고, 두 값을 모두 포함하는 범위를 만들려면 ...을 사용합니다.

var total = 0
for i in 0..<4 {
    total += i
}
print(total)
// Prints "6"

Functions and Closures

Objects and Classes

Enumerations and Structures

Concurrency

Protocols and Extensions

Error Handling

Generics

Share article

code-with-me