나의 발자취

스위프트 컬렉션 (1) 배열 본문

앱 개발/iOS

스위프트 컬렉션 (1) 배열

달모드 2022. 5. 25. 22:52

1. 배열 (Array)

데이터를 순서대로 저장하는 컬렉션 (자동으로 순번 지정됨)

 

📌타입 표기

// 정식문법

let strArray1: Array<Int> = []

// 단축문법

let strArray2: [String] = []

 

📌빈 배열 생성

let emptyArray1: [Int] = []   // 명시적. 하지만 타입을 지우면 컴파일러가 알 수가 없어서 에러가 나기때문에 하나라도 입력하면 타입추론 가능.

let emptyArray2 = Array<Int>()   // 괄호는 생성자를 의미함

let emptyArray3 = [Int]()

 

📌기본 기능

numsArray.count

numsArray.isEmpty

numsArray.contains(1)     // 파라미터로 값을 전달

numsArray.randomElement()

numsArray.swapAt(0, 1)    // 그 인덱스에 해당하는 값들의 위치를 바꿈

 

📌배열의 요소 접근

일반적으로 []서브스크립트 문법(대괄호를 이요한 특별한 함수)을 통해 접근한다.

 

 

 

// 배열의 시작, 마지막 값

stringArray.first   // 리턴값은 옵셔널 (String?)  -> 빈 배열이라면 nil 리턴

stringArray.last

 

// 배열의 시작, 마지막 인덱스

stringArray.startIndex   // = stringArray[0]

stringArray.endIndex   // Index out of range: 우리가 생각하는것보다 1이 큰 값이 나옴. 메모리가 끝나고 비어있는 끝의 주소가 나오기 때문.

stringArray.endIndex.advanced(by: -1) // 그러므로 endIndex를 쓸때는 항상 -1을 해주어야함.

//stringArray.index(i: Int, offSetBy: Int)

 

stringArray[stringArray.startIndex]

stringArray[stringArray.endIndex - 1]

// stringArray[stringArray.index(before: stringArray.endIndex)]

 

 

 

 

stringArray.firstIndex(of: "iOS")     // 앞에서 부터 찾았을때 "iOS"는 배열의 (앞에서부터) 몇번째

stringArray.lastIndex(of: "iOS")     // 뒤에서 부터 찾았을때 "iOS"는 배열의 (앞에서부터) 몇번째. 

(주의) stringArray = ["Apple", "Swift", "iOS", "Hello", "iOS"] 에서 stringArray.lastIndex(of: "iOS") 는 4가 나온다.

 

 

if let index = stringArray.firstIndex(of: "iOS") {

    print(index)

    print(stringArray[index] )

}

 

 

📌배열의 삽입

배열에 접근연산자로 insert 함수를 찾으면 두개가 나온다. 

// 앞 또는 중간에 삽입

// 한 개의 요소 삽입

alphabet.insert("c", at: 0)

//alphabet.insert("c", at: alphabet.endIndex)

 

// 여러개 삽입

alphabet.insert(contentsOf: ["a","b","c"], at: 0)

//alphabet.insert(contentsOf: ["a","b","c"], at: alphabet.endIndex)

 

📌배열의 교체

alphabet = ["A", "B", "C", "D", "E", "F", "G"]

 

1. 요소 교체하기

alphabet[0] = "a"

 

2. 범위를 교체하기

alphabet[0...2] = ["x", "y", "z"]

 

3. 원하는 범위 삭제

alphabet[0...1] = []

 

* 교체하기 함수 문법

alphabet.replaceSubrange(0...2, with: ["a", "b", "c"])

 

📌배열의 추가

alphabet += ["H"]

alphabet.append("H")   // 맨 마지막에 추가하는 것

alphabet.append(contentsOf: ["H", "I"])

//alphabet.append(7)   // 에러 ===> 동일한 자료형만 저장가능함

 

📌배열의 삭제

1. 서브스크립트 문법으로 삭제

alphabet[0...2] = []   //빈배열 전달하면 해당 범위가 삭제

 

 

2. 요소 한개 삭제

alphabet.remove(at: 2)  // 삭제하고, 삭제된 요소 리턴

//alphabet.remove(at: 8)    // 잘못된 인덱스 전달 ====> 에러발생

//alphabet.remove(at: endIndex - 1)

 

3. 요소 범위 삭제

alphabet.removeSubrange(0...2)

 

 

 

alphabet = ["A", "B", "C", "D", "E", "F", "G"]

 

alphabet.removeFirst()   // 맨 앞에 요소 삭제하고 삭제된 요소 리턴 (리턴형 String)

alphabet.removeFirst(2)   // 앞의 두개의 요소 삭제 ===> 리턴은 안함

 

alphabet.removeLast()   // 맨 뒤에 요소 삭제하고 삭제된 요소 리턴 (리턴형 String)

alphabet.removeLast(2)

 

* 배열이 비어있는지도 잘 확인해보고 삭제(제거)해야함 ->에러

// alphabet.removeFirst()    // 리턴형 String

// alphabet.removeLast()     // 리턴형 String

 

 

4. 배열의 요소 모두 삭제(제거)

alphabet.removeAll()

alphabet.removeAll(keepingCapacity: true)  // 저장공간을 일단은 보관해 둠. (안의 데이터만 일단 날림)

 

 

📌배열의 정렬

var nums = [1, 2, 3, 1, 4, 5, 2, 6, 7, 5, 0]

 

 

// 1) 배열을 직접정렬하는 메서드  sort  (동사)

// 2) 정렬된 새로운 배열을 리턴  sorted (동사ing/동사ed)

 

nums.sort()   // 배열을 직접 정렬 (오름차순) (배열리턴 하지 않음)

nums.sorted()    //오름차순으로 정렬

 

nums.reverse()   // 요소를 역순으로 정렬  (배열리턴 하지 않음)

nums.reversed()

 

nums.sorted().reversed()

// 새로운 배열은 생성하지 않고, 배열의 메모리는 공유하면서 역순으로 열거할 수 있는 형식을 리턴

 

 

📌배열 섞기

//nums.shuffle()    // 요소의 순서 랜덤으로 직접 바꾸기

//nums.shuffled()

 

📌배열의 비교

let a = ["A", "B", "C"]

let b = ["a", "b", "c"]

 

a == b   // false

a != b   // true

 

// 개별요소 비교, 저장순서도 비교 하기 때문에

 

 

📌enumerate

// enumerated() -> 열거된 것들을 Named 튜플 형태로 한개씩 전달

 

// 데이터 바구니이기 때문에,

// 실제 번호표(index)까지 붙여서, 차례대로 하나씩 꺼내서 사용하는 경우가 많을 수 있어서 아래처럼 활용 가능

 

nums = [10, 11, 12, 13, 14]

 

for tuple in nums.enumerated() {

    //print(tuple)

    print("\(tuple.0) - \(tuple.1)")  // 튜플의 성격을 이용하여 0: offset, 1: element 대신 사용

}

 

// (offset: 0, element: 10)

// (offset: 1, element: 11)

// (offset: 2, element: 12)

// (offset: 3, element: 13)

// (offset: 4, element: 14)

 

 

for (index, word) in nums.enumerated() {      // 바로 뽑아내기

    print("\(index) - \(word)")

}

 

 

 

 

for (index, value) in nums.enumerated().reversed() {      // 거꾸로 뒤에서 부터

    print("\(index) - \(value)")

}

// -14

// -13

// -12

// -11

// -10

 

'앱 개발 > iOS' 카테고리의 다른 글

스위프트 컬렉션(3) Set  (0) 2022.05.26
스위프트 컬렉션(2) 딕셔너리  (0) 2022.05.25
함수와 옵셔널타입  (0) 2022.05.24
옵셔널 언래핑 Optional Unwrapping  (0) 2022.05.24
옵셔널이란?  (0) 2022.05.24
Comments