본문 바로가기
iOS Swift/문법

[Swift] Array

by 야고이 2024. 2. 22.
728x90

240222

240315

 

배열타입 선언하기

정식 문법

Array<String>

 

단축문법

[String]

 


//타입선언 - 아래 코드 다 같음
let emptyArray: [Int] = []
let emptyArray2 = Array<Int>()
let emptyArray3 = [Int]()
//==============
let emptyArray = [] //타입을 유추할 수 없어서 에러남

마지막 코드 에러


배열이 비어있는지 확인하는 법 

isEmpty
let nums = [1, 2, 3]

nums.count //3

//=================
//배열이 비어있는지 확인
nums.count == 0 //이렇게도 확인할 수 있는데      //false
nums.isEmpty //isEmpty 를 사용하면 더 편리 함  //false

배열 요소에 접근하는 방법  (Accessing Elements)

서브스크립트 문법을 사용하는데, 두가지만 기억하면 된다 스퀘어브라켓[]과 인덱스

let fruits = ["Apple", "Banana", "Melon"] //
fruits[0] //첫번째 인덱스에 접근
fruits[2] //마지막 인덱스에 접근
fruits[0...1] //특정 범위 접근

이렇게 접근해도 되지만 만약에 인덱스 숫자를 잘못 입력한다면?

에러가 난다.

위에 fruit 배열에는 인덱스가 2까지 있기 때문에 이보다 큰 숫자를 입력하면 값이 없기 때문에 오류가 난다.

그래서 정수인덱스 대신에 속성으로 제공하는 인덱스를 사용하면 안전한 코드를 작성 할 수 있다.

startIndex

첫번째 인덱스 접근

index(before: .endIndex)

마지막 인덱스 접근

fruits[fruits.startIndex] //첫번째 인덱스 접근
//fruits[fruits.endIndex] //endIdex 는 배열의 마지막 뒤에 접근하기 떄문에 오류남
fruits[fruits.index(before: fruits.endIndex)] //마지막 인덱스 이전 인덱스 접근

 

이것보다 더 안전하게 접근하는 방법이 있다

아래 두개의 속성은 값이 없으면 nil 를 리턴하고 끝난다. 더 안전하게 접근 할 수 있음.

인덱스를 계산할 수고로움도 덜 수 있다

.first
.last
fruits.first
fruits.last

배열 범위를 지정해서 접근하는 방법

let list = ["A", "B", "C", "D", "E"]
list[0...2]
list[2...] //배열에서는 범위가 정해져 있으니까 one-sided range 를 사용할 수 있다
list[...2]

근데 배열이 100000000000000000개 라면? 끝도없이 배열을 받아오면 범위를 알 수 없다

그럴 땐 prifix 를 사용하면 된다

prefix 
  • 배열의 갯수만큼 새로운 배열을 리턴해준다
  • 배열의 갯수보다 큰 값을 입력해도 배열에 있는 최대만큼만 리턴한다
//prefix 앞에서부터 추출
list.prefix(3) //앞에서부터 3개 리턴 ["A", "B", "C"]
list.prefix(upTo: 3) //upto: 인덱스 3전까지 리턴 ["A", "B", "C"]
list.prefix(through: 3) //through 인덱스 3까지 포함하여 리턴 ["A", "B", "C", "D"

//suffix 뒤에서부터 추출
list.suffix(3) //["C", "D", "E"]
list.suffix(from: 3) // ["D", "E"]

배열에 요소 추가하기 Adding elements

요소 추가: 기존 배열 뒤에 추가 된다
append
var mutableAlphabet = ["A", "B", "C"]

mutableAlphabet.append("E")
mutableAlphabet.append(contentsOf: ["F", "G"]) //여러개 동시에 추가 append(contentsOf: )

여담,, 우측에서 출력 안됨..

나랑 같은 생각 하신 분이 질문함

그래서 위에 처럼 창 다열어서 캡쳐하는점,, 

중간에 추가
insert
mutableAlphabet.insert("D", at: 3) //at으로 추가할 위치 지정
mutableAlphabet.insert(contentsOf: ["a", "b", "c"], at: 0)


요소 바꾸기

//서브스크립트 문법으로 구현
mutableAlphabet[0...2] = ["x", "y", "z"]

//메소드로 구현
//첫번째 파라미터:바꿀범위, 두번째 파라미터: 새로운 배열전달
mutableAlphabet.replaceSubrange(0...2, with: ["x", "y", "z"])

삭제
빈 배열로 정렬하면 요소들이 삭제 된다
mutableAlphabet[0..<1] = []
print(mutableAlphabet)


요소 삭제하기 Removing Elements

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

alphabet.remove(at: 2) //잘못된 인덱스를 전달하지 않도록 조심해야한다
alphabet.removeFirst() // 숫자를 전달하지 않으면 리턴
alphabet.removeFirst(2) //숫자만큼 삭제하고 배열에 남은것, 리턴하지 않는다

alphabet.removeAll() //요소 전체 삭제. 배열이 비어있다면 오류가 발생한다


alphabet.popLast() //배열이 비어 있을 때 nil 를 전달함

alphabet = ["A", "B", "C", "D", "E", "F", "G"]
alphabet.popLast()

//지정 범위 삭제
alphabet.removeSubrange(0...2)

//서브스크립스 문법 사용 하여 삭제
alphabet[0...2] = []



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

alphabet.dropFirst() //첫번째 요소 빼고 나머지 리턴
alphabet.dropFirst(3) //숫자만큼 빼고 나머지 리턴
//원본은 변화 없음

배열 비교

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

a == b //false
a != b //true

a < b //error 배열의 크기나 속성은 비교할 수 없다

메소드로 비교
elementsEqual()
a.elementsEqual(b) // false

 

클로저로 비교방식 직접구현
//대소문자 무시하도록 구현한 코드
a.elementsEqual(b, by: { (lhs, rhs) -> Bool in
    return lhs.caseInsensitiveCompare(rhs) == .orderedSame
})

배열 검색 Finding Elements

.min
.max
가장 작은 값과 가장 큰 값 검색
let a = ["A", "B", "C"]
let randomNumbers = [1, 2, 3, 1, 4, 5, 2, 6, 7, 5, 0]
randomNumbers.min() // 0

a.min() //A 문자열도 아스키 코드로 인해 가장 작은 크기를 구할 수 있음
a.max() //C
contains
배열에 값이 있는지 확인함. 단순히 존재여부만 확인한다.
let randomNumbers = [1, 2, 3, 1, 4, 5, 2, 6, 7, 5, 0]

randomNumbers.contains(1) //true

//짝수가 포함되어 있는지 클로저로 구현
let r3 = randomNumbers.contains { $0.isMultiple(of: 2)} // true
.first
인덱스 혹은 요소 검색
가장 먼저 true 를 리턴하는 결과를 리턴함. 검색에 실패하면 nil 을 리턴한다.
.first 입력하면 여러 기능이 있다는걸 알 수 있다

 

let randomNumbers = [1, 2, 3, 1, 4, 5, 2, 6, 7, 5, 0]

//first(where: )
randomNumbers.first {
    $0.isMultiple(of: 2) // 가장 처음의 짝수 리턴. 위 배열에선 2
}

//=========================


randomNumbers.firstIndex{
    $0.isMultiple(of: 2) //첫번째 짝수 검색. 2의 '인덱스'가 리턴 됨. 위 배열에선 2가 첫번째 짝수이므로 2의 인덱스인 1이 리턴됨
}

//firstIndex(of: )
randomNumbers.firstIndex(of: 7) // 7의 인덱스 8이 리턴됨

//==========================

//첫번째 혹은 마지막 요소 검색. 해당요소의 인덱스 리턴
randomNumbers.firstIndex(of: 5) //5 첫번째 5는 인덱스5
randomNumbers.lastIndex(of: 5) //9 마지막 5는 인덱스 9


배열 정렬 Sorting on Array

sorted
새로운 배열 복사본에 정렬한 뒤 리턴
//오름차순
randomNumbers.sorted() // [0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7] 
randomNumbers //원본배열은 그대로 있음

//내림차순 정렬
let sorted = randomNumbers.sorted { $0 > $1 } 
sorted

 

//randomNumbers.sort()// let으로 선언한건 원본을 바꿀수 없다
var mutableNums = randomNumbers // var 로 다시 정렬함

 //원본 오름차순 정렬
mutableNums.sort()
//내림차순 정렬
mutableNums.reverse()
swapAt
특정요소의 순서 정렬
mutableNums
mutableNums.swapAt(0, 1)
shuffle
순서 랜덤으로 정렬. 실행할 때 마다 순서가 달라진다
mutableNums.shuffle()
mutableNums.shuffled()

728x90

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

[Swift] Initializer  (0) 2024.03.07
UITableViewDataSource, UITableViewDelegate  (1) 2024.02.28
[Swift] String Comparison & Searching  (0) 2024.02.21
[Swift] String Editing #2  (0) 2024.02.21
[Swift] Optionals  (0) 2024.02.21

댓글