상세 컨텐츠

본문 제목

Swift언어 복습노트2 - 컬렉션 타입과 연산자

Swift언어

by 앱등개발자IOS 2022. 5. 23. 12:59

본문

# Swift 컬렉션형

-많은 데이터를 묶어 저장,관리하는 타입

- 아래 컬렉션 형 모두 let으로 선언 시 변경 불가, var -> 변경 가능

- 아래 컬렉션 형 모두 isEmpty프로퍼티, count프로퍼티 사용 가능!

 

#컬렉션형 요약

Dictionary와 Set은 삭제시, 값을 반환해준다. key혹은 해당 원소가 없어도 오류 없이 nil을 반환. 즉, 값이 있어도 Optional타입으로 리턴!

  추가 삭제 조회
배열 arr.append("원소")  arr.removeFirst(), arr.removeLast() arr[1], arr[2]..
딕셔너리  dict["key"] = "원소 dict.removeValue(forKey:"key") (없으면 nil을 반환할 뿐 오류 X ) dict["key"] (없어도 nil을 반환. 오류 X )
Set set.insert("원소") set.remove("원소") (없어도 nil을 반환할 뿐 오류 X) .

컬렉션에서 무작위로 원소를 뽑는 shuffle(), shuffled(), randomElement()등이 있는데, 코딩테스트에서는 쓸 일이 없을 것으로 보이며, 개발에서는 가끔 쓰일 수 있을 것 같다.

# Swift의 배열(Array)

Swift의 배열은 버퍼(Buffer)이다.

버퍼의 크기 조절이 가능하므로, 삽입, 삭제 자유롭다!

 

## Swift배열 초기화

- 주요 프로퍼티

 

1. arr.isEmpty -> 비어있는지 여부 Bool형태로 리턴

2. arr.count -> arr의 길이 return

3. arr.index(of: 원소) -> 찾고자하는 "원소"의 맨 앞 index를 Optional타입으로  리턴 ==>  Deprecated!!

  대신 firstIndex(of:)와 lastIndex(of:)를 사용하자

4. arr.append(원소) -> 원소 추가 

4-1. arr.append(contentsOf: [...], at: 인덱스) -> 여러개 원소 추가 가능 

5. arr.insert(원소, at: 인덱스) -> 해당 index에 "원소" 추가

6. arr.insert(contentsOf: [....], at: 인덱스) -> 해당 index에 여러원소 추가

 

7. arr.remove(at: index)

8. arr.removeFirst(), arr.removeLast() -> 맨 앞 혹은 맨 뒤 원소를 삭제 

9.배열 슬라이싱

10. 배열 마지막 원소를 가져올 때 애먹은 경우가 있었다. last, first 프로퍼티로 가능!! (옵셔널 언래핑 해줘야함!)

# Swift의 딕셔너리(Dictionary)

## Swift 딕셔너리 초기화

- 빈 딕셔너리를 생성해주려면 type을 정확히 명시해야한다!

## Swift 딕셔너리 원소 제거

- 파이썬의 딕셔너리와 비슷하다. 

- 다른 점은 del dict["key"]를 dict.removeValue(forKey: "key")로 하면서 값을 반환해준다.

## Swift 딕셔너리 원소 조회

- 해당 키 값이 없는 경우 default값 지정 가능 => 원래 조회 시, Optional()타입으로 반환되지만, default값을 정해주는 방식으로 조회한다면, Unwrapping되어 반환된다!!

- default를 지정할 때는, 원래의 Dictitionary의 value와 같은 타입으로만 지정 가능하다

# Swift의 Set(집합)자료형

- 파이썬의 set와 비슷하다! ( 같은 원소는 set에 단 하나만 존재 가능)

 

## Swift 딕셔너리 초기화

- 빈 딕셔너리를 생성해주려면 type을 정확히 명시해야한다!

- 축약형이 없다!!! ( Array[Int]를 [Int]로 표시하는 것과 같은 축약형..)

- Array와 같이 [] 대괄호를 사용하므로, 타입명시를 꼭 해주어야한다!

- 주요 메서드

-insert("원소")

-remove("제거할 원소") -> 값을 반환해줌

- set1.intersection(set2) => 교집합

- set1.union(set2) => 합집합

- set1.subtracting(set2) => 차집합

- set1.symmetricDifference(set2) => 배타적 논리합

- set1.sorted() => set내의 원소들을 정렬하여 Array로 리턴!

그 외 set 관련 함수들!

 

# Swift의 enum(열겨형)

- 제한된 선택지만 주고 싶은 경우에 사용

- Swift의 열거형은 고유의 타입으로 인정 -> 버그 가능성 원천 봉쇄

- 원시값(Raw Value) 혹은 연관값(Associated Value)을 가질 수 있다.

 

## type

- type은 열거형 항목이 아닌 열거형 이름인 것을 확인할 수 있다.

 

## 열거형의 원시값

- 열거형 이름 옆에 "원시값" 타입 지정

- rawValue 프로퍼티로 사용

 

## 원시값을 이용한 초기화

- 원시값으로 열거형 항목을 초기화해줄 수 있다.

## 열거형의 항목 순회

- CaseIterable 프로토콜을 채택하면  allCases프로퍼티모든항목이 포함된 배열을 얻을 수 있다.

## 열거형의 연관값

-  열거형 내의 항목이 자신과 연관된 값을 가질 수 있다.

- 마치 열거형 항목Class혹은 구조체이며, 그 안의 멤버변수 혹은 프로퍼티가 생기는 것과 같다.

- 연관값을 가지면 원시값을 가질 수 없고, CaseIterable프로토콜도 따를 수 없다!!!

 

 

# Swift의 연산자 (다른 언어와 다른 특징들만!)

- 0. 부동소수점의 나머지 연산도 지원한다!! ( 다른 언어들에서는 보통 정수만 지원 ) -> ( Float끼리, Double끼리 가능 -> Float과 Double 불가능, Float과 Int 불가능 )

% 연산자는 Int형에서만 가능!!

이외에는 (Int혹은 부동소수점 타입).truncatingRemainder(dividingBy: 2.5)

 

- 1. A === B       ( !==도 마찬가지 )  

A와 B가 참조타입인 경우, A와 B가 같은 인스턴스를 가리키는지 Bool값 return

 

### Swift의 "유일한" 참조타입은 "클래스의 인스턴스" 뿐이다!!!!!!!!!!!!!!!!!!!

( Swift의 기본 데이터 타입모두 구조체로 구현. 따라서 값타입 )

- 의 비교연산에는 ==,  

- 참조타입의 비교연산에는 ===

를 사용한다!!

 

- 2. 범위 연산자

a...b   =>  a부터 b까지 (a와 b포함)

a..<b  => a이상 b미만

 

- 3. nil병합 연산자

 A ?? B    => A가 nil이 아니면 A를 반환하고, A가 nil이면 B반환

 

- 4. 옵셔널 강제 추출 연산자

A!   =>   Unwrapping하여 강제추출

 

- 5. 옵셔널 연산자

A  => A의 값을 안전하게 추출하거나, A가 옵셔널 타입임을 표현 

 

- 6. 오버플로 연산자 

오버플로를 대비하여 연산을 해줌 ( UInt8의 경우 255 &+ 1 ==> 0이 됨 )

&+

&-

&*

 

ex)let value = UInt8.max &+ 1

value ==> 0

관련글 더보기