참고 사이트: iOS 프로그래밍을 위한 스위프트 기초(edwith)
참고 문서: The Swift Language Guide (한국어)
실행 환경: Xcode 12 실행 → Create a new Xcode project → macOS → Command Line Tool 선택 → Product Name, Organization Identifier 입력 후 프로젝트 생성

 

목차

  1. 스위프트(Swift) 5 배워보기 - 1. 다양한 타입
  2. 스위프트(Swift) 5 배워보기 - 2. 함수, 제어문, 옵셔널
  3. 스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형
  4. (계속)

 

상수와 변수

  • 상수(let)는 한 번 선언된 후에는 변경이 불가능하다.
  • 변수(var)는 선언 후 변경이 가능하다.

 

// 상수, 변수 선언법
// 타입은 생략 가능
let 상수명:타입 = 값
let 상수명 = 값

var 변수명:타입 = 값
var 변수명 = 값

 

  • 상수와 변수를 선언 할 때 값을 할당할 수 있다.
  • 만약 선언과 동시에 값을 할당하는 것이 아닌,선언 후 나중에 값을 할당하려면, 선언 할 때 반드시타입명을 명시해야 한다.

 

let sum: Int

let numA: Int = 10
let numB: Int = 20

// 선언 후 값 할당
sum = numA + numB


// 만약 상수에 값을 할당 한 뒤,
// 다시 값을 할당하려고 하면 오류가 발생한다.
let sum: Int = 10

let numA: Int = 10
let numB: Int = 20

sum = numA + numB // Cannot assign to value: 'sum' is a 'let' constant

 

 

기본 데이터 타입

스위프트의 기본 데이터 타입은 아래와 같다.

  • Bool
  • Int, UInt
  • Float, Double
  • Character, String

 

1. Bool

  • truefalse 값만 가진다.
  • 스위프트에서는 타 언어와는 다르게true 대신 1,false 대신 0을 넣으면 오류가 발생한다.

 

var bool: Bool = true
bool = false

 

2. Int, UInt

  • Int: 정수 타입(64비트 정수형)
  • UInt: 양의 정수 타입(64비트 양의 정수형)

 

var int: Int = 100
// int = 100.1 은 오류 발생

var uint: UInt = 100
// uint = -100 은 오류 발생

 

3. Float, Double

  • Float: 실수 타입(32비트 부동소수형)
  • Double: 실수 타입(64비트 부동소수형)

 

var float: Float = 3.14
float = 3 // 정수형 할당도 가능하다.

var double: Double = 3.14
double = 3 // 정수형 할당도 가능하다.

// Double형 변수에 Float형 변수 값을 할당 할 수 없다.
double = float // Cannot assign value of type 'Float' to type 'Double'

 

4. Character, String

  • Character: 문자 타입(유니코드)
  • String: 문자열 타입(유니코드)

 

// 문자 할당은 큰따옴표(")로 한다.
// Character는 한 문자만 할당 가능하다.
var character: Character = "🇰🇷" // 이모지 할당 가능
character = "😄"
character = "가"


// 문자열 할당도 큰따옴표(")로 한다.
// 여러 문자를 할당할 때에는 String을 사용한다.
var string: String = "가나다라"

 

 

Any, AnyObject, nil

스위프트에는 기본 데이터 타입 외에 Any, AnyObject, nil 타입이 있다.

 

1. Any

  • 모든 타입을 지칭하는 키워드

 

var any: Any = 100
any = "모든 타입 할당 가능"

// 단, 아래 코드와 같이 any 변수에 Double형 값을 할당 했어도,
// Double 타입 변수에 할당할 수는 없다.
// 이 경우는 명시적으로 형변환을 해줘야 한다. 
any = 123.12
let double: Double = any  // 오류발생

 

2. AnyObject

  • 모든 클래스 타입을 지칭하는 프로토콜

 

class SomeClass {}
var anyObject: AnyObject = SomeClass()

// AnyObject는 클래스의 인스턴스만 수용 가능하기 때문에 클래스의 인스턴스가 아니면 할당할 수 없습니다.
anyObject = 123.12    // 컴파일 오류발생

 

3. nil

  • '없음'을 의미하는 키워드
  • NULL, Null, null 등과 비슷

 

// any는 Any 타입이고, anyObject는 AnyObject 타입이기 때문에 nil을 할당할 수 없습니다.
var any: Any = 100
var anyObject: AnyObject = SomeClass()

someAny = nil         // 컴파일 오류발생
someAnyObject = nil   // 컴파일 오류발생

 

 

컬렉션 타입

스위프트에는 여러 값들을 묶어서 하나로 표현하는 컬렉션 타입이 있다.

 

1. 배열(Array)

  • 순서(index)가 있는 멤버(value) 리스트 형태의 컬렉션 타입

  • 변수(var)로 할당하면 Array 변경이 가능하고, 상수(let)로 할당하면 변경 불가능하다.

 

  • 빈 배열 생성

 

var someInts = [Int]()

// 배열에 3을 추가
someInts.append(3)

// 배열 비우기
someInts = []

 

  • 기본 값으로 빈 배열 생성

 

// [0.0, 0.0, 0.0] 배열 생성
var doubles = Array(repeating: 0.0, count: 3)
                    반복할 값         반복횟수

 

  • 배열 합치기

 

// [2.5, 2.5, 2.5] 배열 생성
var threeDoubles = Array(repeating: 2.5, count: 3)

// [0.0, 0.0] 배열 생성
var twoDoubles = Array(repeating: 0.0, count: 2)

// 배열 합치기
// [2.5, 2.5, 2,5, 0.0, 0.0]
var sixDoubles = threeDoubles + twoDoubles

 

  • 문자열로 된 배열 생성

 

var shoppingList: [String] = ["Eggs", "Milk"]

// 타입 생략 가능
var shoppingList = ["Eggs", "Milk"]

 

  • 배열의 멤버수 확인: count

 

// count를 사용하여 멤버 수를 셀 수 있다.
var shoppingList = ["Eggs", "Milk"]

print("shoppingList의 멤버 수는 총 \(shoppingList.count) 개입니다.")
// shoppingList의 멤버 수는 총 2 개입니다.

// 위 print 함수의 큰따옴표("") 안에 있는 \()는
// 문자열 보간법(String Interpolation) 이라고 한다.
// 프로그램 실행 중 문자열 내에 변수 또는 상수를 넣어 실행할 때 사용한다.

 

  • 배열이 비었는지 확인: isEmpty

 

if shoppingList.isEmpty {
    print("쇼핑 목록이 비었습니다.")
} else {
    print("쇼핑 목록이 비어있지 않습니다.")
}

 

  • 배열에 멤버 추가: append, +=

 

shopingList.append("Four")

// 또는 +=로 추가할 수 도 있다.
shoppingList += ["Banking Powder"]

 

  • 특정 위치의 멤버에 접근: array[index]

 

// index는 0부터 시작한다.
var firstItem = shoppingList[0]
// firstItem: "Eggs"

 

  • 특정 위치에 멤버 추가/삭제: insert, at, remove, removeLast

 

// 0번 위치에 값 추가
shoppingList.insert("Maple Syrup", at:0)

// 0번 위치의 값을 제거하고 상수에 값 할당
let mapleSyrup = shoppingList.remove(at: 0)
// mapleSyrup: "Maple Syrup"

// 가장 마지막 멤버 삭제
let apples = shoppingList.removeLast()

 

  • 배열 순회: for-in, enumerated()

 

// for-in 반복문 사용
// 멤버만 출력된다.

for item in shoppingList {
    print(item)
}

// Eggs
// Milk
// Four
// Baking Powder
// Chocolate Spread
// Cheese


// enumerated() 사용
// 인덱스와 멤버를 같이 출력할 수 있다.
for (index, value) in shoppingList.enumerated() {
    print("Item \(index + 1): \(value)")
}

// Item 1: Eggs
// Item 2: Milk
// Item 3: Four
// Item 4: Baking Powder
// Item 5: Chocolate Spread
// Item 6: Cheese

 

 

2. 셋(Set)

  • 중복되지 않은 멤버가 순서없이 존재하는 컬렉션

  • 멤버의 타입은 반드시 hashable 이어야 한다.

    • hashable 타입: String, Int, Double, Bool

 

  • 빈 Set 생성

 

// Set은 축약형이 없다.
var letters = Set<Character>()

// 멤버 추가
letters.insert("a")

// Set 비우기
letters = []

 

  • 배열 문자열을 이용한 Set 생성

 

var musicGenres: Set<String> = ["Rock", "Classical", "Pop"]

// 타입 생략 가능
var musicGenres: Set = ["Rock", "Classical", "Pop"]

 

  • Set 멤버수 확인: count

 

var musicGenres: Set = ["Rock", "Classical", "Hip hop"]

print("내가 좋아하는 음악 장르의 수는 \(musicGenres.count)개 입니다.")
// 내가 좋아하는 음악 장르의 수는 3개 입니다.

 

  • Set 비었는지 확인: isEmpty

 

if favoriteGenres.isEmpty {
    print("좋아하는 음악 장르가 없습니다.")
} else {
    print("좋아하는 음악 장르가 있습니다.")
}

 

  • Set 멤버 추가/삭제: insert, remove

 

// 멤버 추가
musicGenres.insert("Kpop")

// Set 에서는 +=를 사용하여 멤버를 추가할 수 없다.

// 멤버 삭제
musicGenres.remove("Rock")

 

  • Set 멤버 포함 여부 확인: contains

 

print(musicGenres.contains("Kpop"))
// 포함: true, 미포함: false

 

  • Set 순회: for-in

 

for genre in musicGenres {
    print("\(genre)")
}

// Kpop
// Hip hop
// Classical

// Set은 index가 없기 때문에 enumrated()를 사용할 수 없다.

 

  • Set 결합: intersection(), symmetricDifference(), union(), subtracting()
    • 수학의 집합 연산자와 동일하다

 

 

let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

// 합집합
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

// 교집합
oddDigits.intersection(evenDigits).sorted()
// []

// 차집합
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]

// 여집합
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]

 

 

3. 딕셔너리(Dictionary)

  • [Key: Value] 형태로 이루어진 컬렉션 타입

 

  • 빈 딕셔너리 생성

 

var namesOfIntegers = [Int: String]()

// Key: Value 추가
namesOfIntegers[16] = "sixteen"

// 딕셔너리 비우기
namesOfIntegers = [:]

 

  • 문자열을 이용한 딕셔너리 생성

 

var airports: [String: String] = = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

 

  • 빈 딕셔너리 확인

 

if airports.isEmpty {
    print("airports 딕셔너리가 비어있습니다.")
} else {
    print("airports 딕셔너리가 비어있지 않습니다.")
}

 

  • 딕셔너리에 Key: Value 할당

 

airports["LHR"] = "London"

 

  • Key에 해당하는 값(Value) 변경

 

// Key: Value 추가
airports["KOR"] = "Seoul"

// Value 변경
airports["KOR"] = "Incheon"

 

  • Key에 해당하는 값(Value) 제거: removeValue

 

airports.removeValue(forKey: "KOR")

// 또는, nil 할당
airports["KOR"] = nil

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">