Swift

Swift - 9. 배열과 딕셔너리

iosos 2024. 1. 6. 17:12

 

가변형 컬렉션, 불변형 컬렉션

  • 불변형 컬렉션 인스턴스에 속한 것은 객체가 초기화된 이후 변경될 수 없음
  • 불변형 컬렉션은 생성할 때 상수에 할당하면 됨
  • 변수에 할당했다면 가변형 컬렉션

 

 

배열 초기화

  • 배열 : 하나의 순서 있는 컬렉션에 여러 값을 담기 위하여 설계된 데이터 타입
  • 배열은 동일한 타입들의 값들만 저장할 수 있음
  • 배열의 타입은 타입 어노테이션을 사용한 구체적 지정과 타입 추론을 이용하여 컴파일러가 식별하게 할 수도 있음
  • 배열을 생성할 때 값들을 갖도록 초기화 → 배열 리터럴
var 변수명 : [타입] = [값1, 값2, 값3 ... ]

 

 

  • 세 개의 문자열 값으로 초기화되어 생성된 새로운 배열을 변수에 할당
// 타입 추론 형태 
// 가변형
var treeArray = ["Pine", "Oak", "Yew"]

// 불변형
let treeArray = ["Pine", "Oak", "Yew"]

 

 

 

  • 타입 어노테이션 활용
var treeArray : [String] = ["Pine", "Oak", "Yew"]

 

 

 

  • 빈 배열 생성
var 변수명 = [타입]()
var priceArray = [Float]()

 

 

 

  • 배열의 각 항목마다 지정된 디폴트 값으로 미리 설정하여 배열이 특정 크기로 초기화
var nameArray = [String](repeating: "My String", count : 10)
print(nameArray) // ["My String", "My String", "My String", "My String", "My String", "My String", "My String", "My String", "My String", "My String"]

 

 

 

  • 배열 합치기 (동일한 타입의 값)
let firstArray = ["red", "blue", "green"]
let secondArray = ["Indigo", "Violet"]

let thirdArray = firstArray + secondArray
print(thirdArray)   // ["red", "blue", "green", "Indigo", "Violet"]

 

 

 

배열 작업하기

 

  • 항목 개수
var itemCount = treeArray.count 

 

 

  • 빈 배열 확인
treeArray.isEmpty

 

 

  • 배열 항목 접근
    • 인덱스 사용
treeArray[2] = "RedWood" // 값 교체

 

 

배열 항목 섞기, 무작위로 가져오기

  • shuffled() 메서드 : 항목의 순서가 무작위로 섞인 새로운 버전의 배열 반환
let suffledTrees = treeArray.shuffled()

 

 

  • randomElement() : 배열의 항목 무작위로 선택하여 접근
let randomTree = treeArray.randomElement()

 

 

 

배열에 항목 추가

  • append 메서드, +, += 연산자를 이용하여 배열에 추가 가능
treeArray.append("Redwood")
treeArray += ["Redwood"]
treeArray += ["Redwood", "Mappled","Birch"]

 

 

 

항목 삽입, 삭제

  • 배열 삽입 : insert(at: ) 메서드 사용 → 특정 인덱스 위치에 삽입 가능
    • 새로 삽입될 인덱스 기준으로 기존 항목들은 오른쪽으로 한 칸씩 이동
  • 삭제 : remove(at : ) 메서드 사용
  • 마지막 항목 삭제 : removeLast()
// 항목 삽입
treeArray.insert("Mapple", at: 0)

// 항목 삭제
treeArray.remove(at: 2)

// 마지막 항목 삭제
treeArray.removeLast()

 

 

 

배열 반복하기

  • for - in 문 사용
// 배열 반복
for tree in treeArray {
    print(tree)
}

 

 

 

타입이 혼합된 배열 생성하기

  • Any 타입 이용
  • 지정된 클래스 타입이 아닌 객체를 참조하는 데 사용됨
let mixedArray : [Any] = ["A String", 123, 123.31]

 

 

  • Any 타입을 사용할 때는 올바른 타입의 요소들이 배열에 포함되었다고 간주하게 되므로 코드 상에서의 프로그래머 실수로 인한 오류 발생 가능
    • 코드에서 사용하기 전, 각 요소에 대한 올바른 타입으로의 형 변환을 직접해야 하는 경우가 있음 
    • 컴파일 오류는 발생하지 않지만, 런타임 충돌 발생
let mixedArray : [Any] = [1, 2, 45, "Hello"]

for object in mixedArray {
	print(object * 10)
}

// error: binary operator '*' cannot be applied to operands of type 'Any' and 'Int'

→ Any 타입과 Int 타입의 곱셈 연산이 불가능함

 

 

  • 이 오류를 없애려면 배열의 요소를 Int 타입으로 다운 캐스팅해야 함
// 다운캐스팅
let mixedArray : [Any] = [1, 2, 45, "Hello"]

for object in mixedArray {
    print(object as! Int * 10)
}

/*
 10
 20
 450
 Could not cast value of type 'Swift.String' (0x1f6248898) to 'Swift.Int' (0x1f624aa48).
 */

→ 동작하다가 배열의 마지막 String 요소에 다다랐을 때 에러 메시지와 함께 충돌 발생

 

 

 

딕셔너리 컬렉션

  • 키-값(key-value) 쌍의 형태로 데이터를 저장하고 관리
  • 딕셔너리는 순서가 없는 단일 컬렉션에 여러 값을 담기 위해 설계된 데이터 타입
  • 딕셔너리에 저장된 각 항목은 연관된 값을 참조하고 접근하는 데 사용되는 유일한 키 와 연결됨
  • String, Int, Double, Bool 타입만 키로 사용 가능

 

 

딕셔너리 초기화

  • 딕셔너리에 있는 각 항목은 키(key), 그와 곤련된 값(value)로 구성
  • 키의 데이터 타입과 값 항목의 타입은 타입 어노테이션을 이용하거나 타입 추론을 이용
  • 딕셔너리 리터럴
var 변수명 : [키 타입 : 값 타입] = [키1 : 값1, 키2 : 값2 ..... ]

 

 

 

  • ISBN 번호와 그에 해당하는 책 제목 형태의 딕셔너리
var bookDict = ["100-432112" : "Wind in the Willows",
                "200-532874" : "Tale of Two Cities",
                "202-546549" : "Sense and Sensibility",
                "104-109834" : "Shutter Island"]

var bookDict : [String : String] =
                ["100-432112" : "Wind in the Willows",
                "200-532874" : "Tale of Two Cities",
                "202-546549" : "Sense and Sensibility",
                "104-109834" : "Shutter Island"]
  • 키와 값 항목을 String 타입으로 사용
  • 다른 타입의 키 또는 값이 삽입되지 못함

 

 

 

  • 빈 딕셔너리 생성
var 변수명 = [키 타입 : 값 타입]()

var myDictionary = [Int : String]()

 

 

 

시퀀스 기반의 딕셔너리 초기화

  • 키, 값을 나타내는 시퀀스를 이용하여 초기화 가능
  • zip() 함수 사용
let keys = ["100-432112", "200-532874", "202-546549", "104-109834" ]
let values = ["Wind in the Willows", "Tale of Two Cities", "Sense and Sensibility", "Shutter Island"]

let bookDict = Dictionary(uniqueKeysWithValues: zip(keys, values))

 

 

 

 

  • 미리 정의된 키 배열이 아닌 1부터 시작하는 숫자를 키로 설정
let values = ["Wind in the Willows", "Tale of Two Cities", "Sense and Sensibility", "Shutter Island"]
var bookDict2 = Dictionary(uniqueKeysWithValues: zip(1..., values))

// bookDick2와 같은 결과
var bookDict3 = [1 : "Wind in the Willows",
                 2 : "Tale of Two Cities",
                 3 : "Sense and Sensibility",
                 4 : "Shutter Island"]

 

 

 

딕셔너리 항목 개수

print(bookDict2.count)

 

 

항목 접근하기와 갱신하기

  • 특정 값은 해당 키 잠조하여 첨자 구문 이용
  • bookDict 딕셔너리에 키 값을 이용하여 해당 값 출력
print(bookDict["200-532874"])   // Optional("Tale of Two Cities")

 

 

  • 지정된 키에 해당하는 값이 없는 경우 사용될 디폴트 값 선언
print(bookDict["999-123123", default: "Book not found"])    // Book not found
print(bookDict["200-532874", default: "Book not found"])   // Tale of Two Cities

 

 

  • 항목 갱신하기
bookDict["200-532874"] = "Sense and Sensibility"
print(bookDict["200-532874", default: "Book not found"])   // Sense and Sensibility

 

 

 

  • 변경될 값과 해당 키를 전달하여 update(forKey: ) 메서드 호출
bookDict.updateValue("The Runis", forKey: "200-532874")
print(bookDict["200-532874", default: "Book not found"])   // The Runis

 

 

 

딕셔너리 항목 추가하기와 제거하기

  • 딕셔너리 항목추가
딕셔너리 변수[키] = 값
bookDict["300-898871"] = "The Overlook"

 

 

  • 제거
    • 해당 항목을 nil로 설정하거나 딕셔너리 인스턴스의 remove(forKey:) 메서드 호출
bookDict["300-898871"] = nil
bookDict.removeValue(forKey: "300-898871")

 

 

 

딕셔너리 반복

  • for - in 반복문 사용
  • 책 딕셔너리에 있는 모든 항목을 가져다가 각각의 키, 값을 출력
for (bookId, title) in bookDict {
    print("Book ID : \(bookId) Title : \(title)")
}

/*
 Book ID : 104-109834 Title : Shutter Island
 Book ID : 100-432112 Title : Wind in the Willows
 Book ID : 200-532874 Title : The Runis
 Book ID : 202-546549 Title : Sense and Sensibility
 */

 

'Swift' 카테고리의 다른 글

Swift - Xcode 프로젝트 생성  (0) 2024.06.24
Swift - 10. 에러 핸들링  (0) 2024.01.06
Swift - 8. 프로퍼티 래퍼  (0) 2023.12.29
Swift - 7. 구조체  (0) 2023.12.28
Swift - 6. 서브 클래싱과 익스텐션 개요  (0) 2023.12.28