본문 바로가기

Swift 문법정리

Collection Types 정리

1-1. 배열의 선언과 초기화

같은 타입의 여러 개의 값을 순서대로 저장한 리스트로 각 배열의 아이템에는 순서가 있고 순서는 인덱스라고 부릅니다. 0부터 시작하고 아이템이 추가되면 차례대로 증가합니다. 

 

var noun : [String] = ["hat", "pencil", "keyboard"]  // 위아래는 같은 결과를 같습니다.
var noun = ["hat", "pencil", "keyboard"] // 타입추론에 의해 문자열을가지는 배열이 됩니다.

noun [0] // "hat"
noun [1] // "pencil"
noun [2] // "keyboard"
// 인덱스를 이용해 배열 안의 값을 불러올 수 있습니다.

 

위와 같이 배열 안에 직접 값을 넣어 배열을 사용하는 경우도 있지만 아래와 같이 빈 배열을 선언만 하고 초기화한 후에 나중에 값을 넣는 경우가 더 많습니다.

 

var noun = Array<String> // 문자열 배열 noun 선언만 한 상황
noun = Array () // 문자열 배열 noun 초기화만 한 상황
var noun = Array<String>() // 문자열 배열 noun을 선언, 초기화한 상황

 

위의 예시는 빈 문자열을 선언만 하거나 초기화만 하거나 선언과 초기화를 같이 한 예입니다. 배열은 선언만 했을 경우에는 메모리에서 공간을 차지하지 않다가 초기화가 되면 메모리 공간을 할당받습니다.

위와 같은 방법 말고도 아래와 같은 형식으로도 배열을 생성할 수 있습니다.

 

var noun : [String] // 선언만 한 상황
noun = [String}() // 첫번째 초기화한 상황
noun = [] // 두번째 초기화한 상황
var noun = [String]() // 배열 선언 및 초기화 한 상황

1-2. 배열을 수정하는 법

var noun = ["hat", "pencil", "keyboard"] // "hat", "pencil"

var firstItem = noun[0] // "hat"

noun.append("pie") // "hat", "pencil", "pie"
noun.append(contents of : ["note", "cat"]) // "hat", "pencil", "pie", "note", "cat"
noun = noun + ["ice", "people"] // "hat", "pencil", "pie", "note", "cat", "ice", "people"
noun.insert("water", atIndex:0)  // "water", "hat", "pencil", "pie", "note", "cat", "ice", "people"

noun[0] = "line" // "line", "hat", "pencil", "pie", "note", "cat", "ice", "people"
noun[6...8] = ["coin", "cup"] //"line", "hat", "pencil", "pie", "note", "cat", "coin", "cup"


let water = noun.removeAtIndex(0) // 지워진 "line" 값을 반환 합니다. "hat", "pencil", "pie", "note", "cat", "coin", "cup"
let cup = noun.removeLast() // 지워진 "cup" 값을 반환합니다. "hat", "pencil", "pie", "note", "cat", "coin"

 

자신이 원하는 인덱스 번호의 배열을 가져오기 위해서는 noun [인덱스 번호]로 값을 가져올 수 있습니다. 

배열을 추가하기 위해서는. append(추가를 원하는 값)을 사용하거나 noun.append(contents of : ["추가를 원하는 값", "추가를 원하는 값"])으로 2개 이상의 아이템을 추가 가능하며 직접적으로 +연산자를 사용하여 +["ice", "people"]

도 가능하며 noun.inerst("변경하고자 하는 값", atIndex: 인덱스 번호)는 해당 인덱스 번호에 해당 값을 넣고 넣어진 값의 순서는 한 칸씩 밀려나게 합니다.

특정 인덱스 번호를 수정하기 위해서는 noun [인덱스 번호] = "변경하고자 하는 값"으로 가능하며 범위 연산자를 활용하여 noun [범위... 범위] = ["변경하고자 하는 값", "변경하고자 하는 값"]으로 변경이 가능하며 만약 변경하는고자 하는 범위보다 값의 개수가 적다면 빈 형태로 반환됩니다. 

noun.removeAtIndex(인덱스 번호)는 해당 인덱스 번호의 값을 지우고 해당 값을 반환하고 noun.removeLast() 마지막 값을 지우고 해당 값을 반환합니다. 

1-3. 배열을 순회 탐색하는 방법

순회 탐색한다는 것은 데이터를 처음부터 마지막까지 순서대로 읽는 것을 말합니다.

 

var noun : [String] = ["hat", "pencil", "keyboard"]

let count = noun.count // 3

for i in 0..<count {
	print("\(i)번째 아이템은 \(noun[i])입니다.")
}

// 1번째 아이템은 hat 입니다.
// 2번째 아이템은 pencil 입니다.
// 3번째 아이템은 keyboard 입니다

 

위의 예는 noun의 개수를 구한 후 for in 구문의 반복문을 이용해 범위를 통해 순회 탐색을 했습니다. 

 

var noun : [String] = ["hat", "pencil", "keyboard"]
for row in noun {
	print("아이템은 \(row) 입니다")
}
// 아이템은 hat 입니다
// 아이템은 pencil 입니다
// 아이템은 keyboard 입니다

 

첫 번째 예시가 배열의 개수를 이용해 범위를 통해 순회 탐색을 했다면 두 번째 예시는 noun이라는 배열 자체를 통해 순회 탐색을 합니다.

 

2. 딕셔너리

2-1. 딕셔너리의 선언과 초기화

Dictionary<String, Int> ()
Dictionary<Int, String> ()
Dictionary<String, String> ()

<String, Int> ()
<Int, String> ()
<String, String> ()

 

딕셔너리는 위와 같이 2가지 형태로 사용이 가능하며 키와 값을 동시에 사용하기 때문에 키의 타입 : 값의 타입을 적어주는 것이 필요합니다. 타입은 다양한 형태로 사용이 가능합니다. 

 

var airport = Dictionary<String, String>() // 선언과 초기화를 동시에 한 경우
var airport = [String, String]() // 선언과 초기화를 동시에 한 경우

var airport : Dictionary<String, String> // 선언만 한 경우
airport = Dictionary() // 초기화만 한 경우

var airport : [String : String] // 선언만 한 경우
airport = [String : String]() // 초기화만 한 경우

airport = [:] // 빈 딕셔너리는 만든 경우

 

딕셔너리는 배열과 다르게 초기화 구문에서 함부로 타입을 생략해서는 안됩니다. 배열의 경우 var noun = ["hat", "pencil", "keyboard"]처럼 타입 추론을 이용하여 문자열이라는 타입을 생략했지만 딕셔너리 같은 경우 선언할 때 타입을 적어줬기 때문에 초기화 구문에서 타입을 생략하고 초기화할 수 있었습니다.

2-2. 딕셔너리 수정 방법

var airport = [String : String]()
airport["DUB"] = "Dublin"  // DUB : Dublin

airport["DUB"] = "DublinAirplane"//  DUB : DublinAirplane

 

딕셔너리 안에 "DUB"라는 키와 "Dublin"이라는 값을 넣어 한쌍의 키-값을 만들었습니다. 만약 키값에 들어있는 값을 다른 값으로 바꾸고자 한다면 키 값을 불러 다른 값으로 바꾸면 됩니다. 배열과 다른 점은 배열은 인덱스 번호를 통해 값에 접근했다면 딕셔너리는 키 값을 이용해 값에 접근합니다. 

 

let oldvalue = airports.updateValue("Dublin", forkey:"DUB") // Optional("DublinAirport") 값 반환 Dub : Dublin

 

값을 변환하기 위해 updateValue라는 메서드를 사용할 수 있는데 key값을 적고 바꾸고자 하는 값을 넣으면 됩니다. updateValue메서드는 바꾸기 이전의 값을 옵셔널로 반환한다는 특징이 있습니다. 이유는 "DUB"라는 키가 없을 경우 nil을 반환해야 하기 때문에 혹시나 모를 오류를 방지하기 위해 옵셔널로 값을 반환합니다. 만약 새로운 키와 값을 입력한다면 이 역시 nil 값을 반환합니다. 

 

let aiportname = airpots["DUB"] // Optional("Dublin") DUB : Dublin 

 

딕셔너리의 값을 가져오기 위해서는 키 값을 넣어 해당 값을 가져옵니다. 위의 예시와 마찬가지로 옵셔널 값으로 반환되는데 이는 앞서 말했듯이 DUB 값이 존재하지 않을 때 nil 값을 반환해야 하기 때문에 입니다.

 

airport ["APL"] = "Apple International" // DUB : Dublin, APL : Apple International
airport ["APL"] = nil // DUB : Dublin

 

딕셔너리에 있는 키-값을 지우고 싶다면 키값을 불러와 nil을 이용하면 해당 키-값을 지울 수 있습니다. 

 

airports.removeValueForKey("DUB") // Optional("Dublin")   값 없음

 

메서드를 통해 키-값을 지운다면 메서드를 통해 키를 불러오면 지워지는 값이 옵셔널로 반환됩니다. 이는 앞서 언급했던 이유와 같습니다. 

2-3. 딕셔너리를 순회 탐색과 딕셔너리 키, 값 배열로 만드는 방법

var airport = ["YYZ" : "Toronto", "DUB" : "Dublin"]
for (airportCode, airportName) in airport {
	print("\(airportCode) : \(airportName)")
}
// YYZ : Toronto
// DUB : Dublin

 

위의 예는 aiport라는 딕셔너리의 키와 값을 (airportCode, airportName)에 넣어 for in 구문을 통해 값을 도출시켰습니다.

 

for airportCode in airports.values {
	print(airportCode)
}
// Toronto, Dublin

 

위의 예는 aiport, value를 통해 딕셔너리의 값만 가져와 for in 구문을 통해 값을 도출시켰습니다. 

 

let airportCodes = [String](airport.keys)
//YYZ, DUB 

let airportNames = [String](airport.values)
//Toronto, Dublin 

 

위의 예는 문자열을 갖는 배열을 만들고 airport.keys 와 airport.value를 통해 딕셔너리의 키와 값을 배열로 만들었습니다.

'Swift 문법정리' 카테고리의 다른 글

1.3 Classes and Structures Method정리  (0) 2020.05.21
1.2 Classes and Structures Property 정리  (0) 2020.05.14
1.1 Classes and Structures 정리  (0) 2020.05.13
Function 정리  (0) 2020.05.11
Optional 정리  (0) 2020.05.08