Swift - 콜렉션 타입

임성빈·2022년 3월 5일
0

Swift

목록 보기
4/26
post-thumbnail
post-custom-banner

Swift에서는 콜렉션 타입으로 Array, Dictionary, Set 세 가지를 지원한다.


콜렉션의 변경

Array, Dictionary, Set을 변수(var)에 할당하면 이 콜렉션은 변경가능하고 상수(let)에 할당하면 변경이 불가능하다.


배열

배열의 축약형 문법

배열 타입은 Array로 적을 수 있는데 축약형으로 [Element] 형태로 사용할 수 있다.

빈 배열의 생성

아래와 같이 Int형 빈 배열을 생성할 수 있다.

var someInts = [Int]()
print("someInts is of type [Int] with \(someInt.count) items.")
//	someInts is of type [Int] with 0 items.
someInts.append(3)
//	배열에 3을 추가

someInts = []
//	배열 비우기. 배열의 아이템 타입은 그대로 Int로 유지된다.

기본 값으로 빈 배열 생성

repeating 메소드와 count 메소드를 이용해 기본 값으로 빈 배열을 생성할 수 있다.

var threeDoubles = Array( repeating: 0.0, count: 3 )
// threeDoubles : Double 타입의 [ 0.0, 0.0, 0.0 ] 

다른 배열을 추가한 배열의 생성

+ 연산자를 이용해 배열을 합칠 수 있다.

var anotherThreeDoubles = Array( repeating: 2.5, count: 3 )
// anotherThreeDoubles : [ 2.5, 2.5, 2.5 ]

var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles : [ 0.0, 0.0, 0.0, 2.5, 2.5, 2.5 ]

리터럴을 이용한 배열의 생성

[ value1, value2, value3 ] 형태를 이용해 배열을 생성할 수 있다.

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

더 간단하게 선언할 수도 있다.

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

배열 접근 및 변환

배열의 원소 개수 확인

print("The shopping list contains \(shoppingList.count) items.")
// The shopping list contains 2 items.

배열이 비었는지 확인

if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
    print("The shopping list is not empty.")
}

// The shopping list is not empty.

배열에 원소 추가

shoppingList.append("Four")
// shoppingList.count = 3
shoppingList += [ "Baking Powder" ]
// shoppingList.count = 4

shoppingList += [ "Chocolate Spread", "Cheese", "Butter" ]
// shoppingList.count = 7

배열의 특정 위치의 원소 접근

var firstItem = shoppingList[0]
// firstItem : "Eggs"

배열의 특정 위치의 원소 변경

shoppingList[0] = "Six eggs"
// 배열의 첫번째 원소가 "Eggs"에서 "Six eggs"로 변경
shoppingList[4..6] = [ "Bananas", "Apples" ]
// 4, 5, 6번째 인덱스 아이템을 Bananas, Apples로 변환
// 즉, 아이템 3개가 2개로 줄었다.
// shoppingList.count = 6

특정 위치에 원소 추가/삭제/접근

shoppingList.insert( "Maple Syrub", at: 0 )
// shoppingList.count = 7
let maplesyrub = shinppingList.remove(at: 0)
// shoppingList.count = 6
firstItem = shoppingList[0]
// firstItem : "Six eggs"
let apples = shoppingList.removeLast()
// shoppingList.count = 5

배열의 순회

for-in loop를 이용해 배열을 순회할 수 있다.

for item in shoppingList {
	print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas

배열의 값과 인덱스가 필요할 때는 enumerated() 메소드를 사용한다.
이때 배열의 인덱스는 0부터 시작한다.

for (index, value) in shoppingList.enumerated() {
    print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas

Set

Set 형태로 저장되기 위해서 반드시 타입이 hashable이어야한다.
Swift에서 String, Int, Double, Bool 같은 기본 타입은 기본적으로 hashable이다.

Set은 순서가 정의되지 않은 콜렉션에서 동일한 유형의 고유한 값을 저장한다. 항목 순서가 중요하지 않거나 항목을 확인해야 하는 경우 Array 대신 Set을 사용할 수 있다.

빈 Set 생성

var letters = Set<Character>()
print("letters is of of type Set<Character> with \(letters.count) item.")
// letters is of of type Set<Character> with 0 item.
letters.insert("a")
// 이제 letters는 Character 타입의 값을 1개 갖는다.

letters = []
// 이제 letters는 빈 Set이다. 하지만 여전히 Character 타입의 Set이다.

배열 리터럴을 이용한 Set 생성

var favoritGenres: Set<String> = [ "Rock", "Hip Hop", "Classical", ]
// favoriteGeneres가 세 가지 초기 항목으로 초기화

Swift의 타입추론으로 아래와 같은 선언도 가능하다.

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

Set의 접근과 변경

count 프로퍼티를 통해 Set의 원소 개수를 셀 수 있다.

print("I have \(favoriteGenres.count) favorite music genres.")
// I have 3 favorite music genres.

Set은 isEmpty, insert(\_:), remove(\_:), contains(\_:) 메소드를 사용할 수 있다.

if favoriteGenres.isEmpty {
    print("As far as music goes, I'm not picky.")
} else {
    print("I have particular music preferences.")
}
// Prints "I have particular music preferences."
favoriteGenres.insert("Jazz")
// 이제 favoriteGenres은 4 개의 원소를 포함
if let removedGenre = favoriteGenres.remove("Rock") {
    print("\(removedGenre)? I'm over it.")
} else {
    print("I never much cared for that.")
}
// Prints "Rock? I'm over it."
if favoriteGenres.contains("Funk") {
    print("I get up on the good foot.")
} else {
    print("It's too funky in here.")
}
// Prints "It's too funky in here."

Set의 순회

for-in loop를 사용해 Set을 순회할 수 있다.

for genre in favoriteGenres {
    print("\(genre)")
}
// Classical
// Hip hop
// Jazz

Set 명령

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]

Set의 맴버십과 동등비교

Set의 동등비교와 맴버 여부를 확인하기 위해 각각 == 연산자와 isSuperset(of:), isStrictSubset(of:), isStrictSuperset(of:), isDisjoint(with:) 메소드를 사용한다.

let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]

houseAnimals.isSubset(of: farmAnimals)
// true
// Set의 모든 값이 지정된 Set에 포함되어 있는지 여부를 확인

farmAnimals.isSuperset(of: houseAnimals)
// true
// Set에 지정된 Set의 모든 값이 포함되어 있는지 여부를 확인

farmAnimals.isStrictSubset(of: houseAnimals)
// false
houseAnimals.isStrictSubset(of: farmAnimals)
// true
// Set이 지정된 Set과 같지 않지만 부분 집합인지 상위 집합인지를 확인하려면 isStrictSubset(:) 또는 isStrictSuperset(:) 메서드를 사용합니다.

farmAnimals.isDisjoint(with: cityAnimals)
// true
// 두 개의 Set가 공통점이 없는지 확인

Dictionary

Dictionar는 정의된 순서 없이 콜렉션에 동일한 유형의 keyvalue 사이의 연결을 저장한다.
각 value는 Dictionary 내에서 해당 value의 식별자 역할을 하는 고유한 key와 연결된다. Array의 항목과 달리 Dictionary의 항목에는 순서가 지정되어 있지 않다.
실제 Dictionary가 특정 단어의 정의를 찾는 데 사용되는 것과 거의 같은 방식으로 식별자를 기준으로 값을 검색해야 할 때 Dictionary를 사용한다.

주의
Swift의 Dictionary타입은 Foundation 클래스의 NSDictionary를 bridge한 타입이다.

축약형 Dictionary

[Key: Value] 형태로 Dictionary를 선언해 사용할 수 있다.

빈 Dictionary 생성

var namesOfIntegers: [Int: String] = [:]
// namesOfIntegers은 비어있는 [Int: String] 타입의 Dictionary

또는 아래와 같이 빈 Dictionary를 생성할 수 있다.

var alsoNamesOfIntegers: [Int: String]()
namesOfIntegers[16] = "sixteen"
// 이제 namesOfIntegers 1 개의 key-value 쌍을 포함

namesOfIntegers = [:]
// 다시 namesOfIntegers는 비어있는 [Int: String] 타입의 Dictionary

리터럴를 이용한 Dictionary의 생성

[key1: value1, key2: value2, key3: value3] 형태로 Dictionary를 선언할 수 있다.

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

Dictionary의 접근과 변경

print("The airports dictionary contains \(airports.count) items.")
// The airports dictionary contains 2 items.

빈 Dictionary 확인

if airports.isEmpty {
    print("The airports dictionary is empty.")
} else {
    print("The airports dictionary isn't empty.")
}
// Prints "The airports dictionary isn't empty."

서브스크립트를 사용하여 Dictionary에 새 항목을 추가할 수 있다.
적절한 유형의 새 key를 서브스크립트 인덱스로 사용하고 적절한 유형의 새 value을 할당한다.

airports["LHR"] = "London"
// key는 "LHR", value는 "London"인 새로운 key-value를 할당
profile
iOS 앱개발
post-custom-banner

0개의 댓글